倚天杖
在您的适配器中添加此类:private class VIEW_TYPES { public static final int Header = 1; public static final int Normal = 2; public static final int Footer = 3;}然后覆盖这样的以下方法:@Overridepublic int getItemViewType(int position) { if(items.get(position).isHeader) return VIEW_TYPES.Header; else if(items.get(position).isFooter) return VIEW_TYPES.Footer; else return VIEW_TYPES.Normal;}现在,在onCreateViewHolder方法中,根据视图类型为您的布局充气:@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View rowView; switch (i) { case VIEW_TYPES.Normal: rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.normal, viewGroup, false); break; case VIEW_TYPES.Header: rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header, viewGroup, false); break; case VIEW_TYPES.Footer: rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.footer, viewGroup, false); break; default: rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.normal, viewGroup, false); break; } return new ViewHolder (rowView);}现在,在onBindViewHolder方法中,基于视图持有者绑定布局:@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { int viewType = getItemViewType(position); switch(viewType) { case VIEW_TYPES.Header: // handle row header break; case VIEW_TYPES.Footer: // handle row footer break; case VIEW_TYPES.Normal: // handle row item break; } }希望这会有所帮助。
慕婉清6462132
使用ItemDecorations无需修改任何其他代码,这非常容易:recyclerView.addItemDecoration(new HeaderDecoration(this, recyclerView, R.layout.test_header));保留一些用于绘制的空间,填充要绘制的布局,然后在保留的空间中绘制它。装饰代码:public class HeaderDecoration extends RecyclerView.ItemDecoration { private View mLayout; public HeaderDecoration(final Context context, RecyclerView parent, @LayoutRes int resId) { // inflate and measure the layout mLayout = LayoutInflater.from(context).inflate(resId, parent, false); mLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); // layout basically just gets drawn on the reserved space on top of the first view mLayout.layout(parent.getLeft(), 0, parent.getRight(), mLayout.getMeasuredHeight()); for (int i = 0; i < parent.getChildCount(); i++) { View view = parent.getChildAt(i); if (parent.getChildAdapterPosition(view) == 0) { c.save(); final int height = mLayout.getMeasuredHeight(); final int top = view.getTop() - height; c.translate(0, top); mLayout.draw(c); c.restore(); break; } } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (parent.getChildAdapterPosition(view) == 0) { outRect.set(0, mLayout.getMeasuredHeight(), 0, 0); } else { outRect.setEmpty(); } }}