Adding header view to recyclerview with gridlayout manager
suggest changeTo add a header to a recyclerview with a gridlayout, first the adapter needs to be told that the header view is the first position - rather than the standard cell used for the content. Next, the layout manager must be told that the first position should have a span equal to the *span count of the entire list. *
Take a regular RecyclerView.Adapter class and configure it as follows:
public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int ITEM_VIEW_TYPE_HEADER = 0; private static final int ITEM_VIEW_TYPE_ITEM = 1; private List<YourModel> mModelList; public HeaderAdapter (List<YourModel> modelList) { mModelList = modelList; } public boolean isHeader(int position) { return position == 0; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); if (viewType == ITEM_VIEW_TYPE_HEADER) { View headerView = inflater.inflate(R.layout.header, parent, false); return new HeaderHolder(headerView); } View cellView = inflater.inflate(R.layout.gridcell, parent, false); return new ModelHolder(cellView); } @Override public int getItemViewType(int position) { return isHeader(position) ? ITEM_VIEW_TYPE_HEADER : ITEM_VIEW_TYPE_ITEM; } @Override public void onBindViewHolder(RecyclerView.ViewHolder h, int position) { if (isHeader(position)) { return; } final YourModel model = mModelList.get(position -1 ); // Subtract 1 for header ModelHolder holder = (ModelHolder) h; // populate your holder with data from your model as usual } @Override public int getItemCount() { return _categories.size() + 1; // add one for the header } }
Then in the activity/fragment:
final HeaderAdapter adapter = new HeaderAdapter (mModelList); final GridLayoutManager manager = new GridLayoutManager(); manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return adapter.isHeader(position) ? manager.getSpanCount() : 1; } }); mRecyclerView.setLayoutManager(manager); mRecyclerView.setAdapter(adapter);
The same approach can be used add a footer in addition to or instead of a header.
Source: Chiu-Ki Chan’s Square Island blog
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents