web-dev-qa-db-ja.com

GridLayoutManagerの列数を動的に変更する

私は実際にアプリで2つの列を持つGridLayoutManagerを使用していますが、使用するビューの種類に応じて1つの列が必要です。

これが私のフラグメントのメソッド「onCreateView()」にあるコードです:

// Recycler view for users
usersList = (RecyclerView) mView.findViewById(R.id.usersList);

// Layout manager (grid of users
layoutManager = new GridLayoutManager(mContext, 2);
usersList.setLayoutManager(layoutManager);

// ArrayList of users
users = new ArrayList<User>();

// Set the adapter for the list of users
mHomeListAdapter = new HomeListAdapter(getActivity(), users);
usersList.setAdapter(mHomeListAdapter);

次に、私のアダプターには、この種のコードがあります:

@Override
public int getItemViewType(int position) {
    if (position == 5) {
        return TYPE_PREMIUM;
    } else {
        return TYPE_ITEM;
    }
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_PREMIUM) {
        View view = mInflater.inflate(R.layout.become_premium, parent, false);
        HeaderViewHolder holder = new HeaderViewHolder(view);
        return holder;
    } else {
        View view = mInflater.inflate(R.layout.posts_item, parent, false);
        ViewHolderPosts holder = new ViewHolderPosts(view);
        return holder;
    }
}

したがって、ビュー「TYPE_PREMIUM」を使用する場合は、ボタンを(1列に)表示し、他の結果には通常のグリッドビュー(2列)を表示したいと思います。

これを行うことは可能ですか?

ありがとう!

14
fraxool
mGridLayoutManager = new GridLayoutManager(mContext, 2);
mGridLayoutManager.setSpanSizeLookup(onSpanSizeLookup);    

/**
 * Helper class to set span size for grid items based on orientation and device type
 */
GridLayoutManager.SpanSizeLookup onSpanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return mHomeListAdapter.getItemViewType(position) == TYPE_PREMIUM ? 2 : 1;
    }
};
28
android.fryo

私があなたの質問を理解した場合、プレミアムタイプのビューを1列ではなく2列にまたがらせたいですか?これは、カスタム SpanSizeLookupsetSpanSizeLookup(SpanSizeLookup) で設定することで可能になります。

2
Coen B

レイアウトマネージャーの列を変更するためにチェックボックスを使用していました。これを使用して、GridLayoutManager列を変更する必要があります。ここにコードがあります:

 checkBox = findViewById(R.id.change_manager);

    checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (checkBox.isChecked()) {
                layoutManager.setSpanCount(2);
                isLayoutChange = true;
            } else {
                isLayoutChange = false;
                layoutManager.setSpanCount(3);
            }
        }
    });

およびboolean layoutManagerの変更をチェックするためのonResume()onRestart()およびonPause()メソッド。このように使用してください:

  if (isLayoutChange) {
        layoutManager.setSpanCount(2);
    } else {
        layoutManager.setSpanCount(3);
    }
0
A.ebrahimi