Dynamically change the number of columns of a GridLayoutManager

14,456

Solution 1

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;
    }
};

Solution 2

If I understand your question, you would like to let premium-type Views span 2 columns instead of 1? That's possible by setting a custom SpanSizeLookup with setSpanSizeLookup(SpanSizeLookup).

Share:
14,456
fraxool
Author by

fraxool

I'm a full-stack freelance web & app developer since 2013. I sell complete PHP scripts on CodeCanyon and I also like to write about jQuery on my own blog at jQuery-Script.com.

Updated on June 06, 2022

Comments

  • fraxool
    fraxool about 2 years

    I am actually using a GridLayoutManager with two columns in my app and I would like to have one column depending on the view type used.

    Here is the code I have in the method "onCreateView()" of my fragment :

    // 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);
    

    Then, in my adapter, I have this kind of code :

    @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;
        }
    }
    

    So, when the view "TYPE_PREMIUM" is used, I would like to display a button (so in one column) and have a normal gridview (two columns) for the other results.

    Is it possible to do this?

    Thanks!