RecycleView想必大家都不陌生,它已他的高拓展性取代了傳統布局顯示,同時配合協調布局,可以實現很多意想不到的酷炫交互,今天就和大家介紹一下,如何給RecycleView添加頭布局和尾布局,同時你也可以通過自己的拓展實現更多復雜的布局。
首先我們先看一下效果:
實現頭部尾部布局其實方法還是很多,這里我推薦使用Adapter設置itemType來做,那么問題來了,為什么這么做呢?因為拓展性更強,並且更加解耦。將邏輯都寫在adapter中,比起寫在activity中管理起來也更加方便。
首先,我們需要明確一點,什么是head,什么是foot,當位於第一個item的時候就是head,最后一個就是foot.之后我們根據不同的itemType加載出來就可以了。
第一步判斷頭尾部以及內容區域:
private int getBodySize() { return listData.size(); } private boolean isHead(int position) { return headCount!=0&&position<headCount; } private boolean isFoot(int position) { return footCount!=0&&(position>=(getBodySize()+headCount)); } public int getItemViewType(int position) { if (isHead(position)) { return HEAD_TYPE; }else if (isFoot(position)) { return FOOT_TYPE; }else { return BODY_TYPE; } }
根據不同的ViewType生產不同的Holder
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case HEAD_TYPE: return new HeadViewHolder(mLayoutInflater.inflate(R.layout.trend_head,parent,false)); case BODY_TYPE: return new BodyViewHolder(mLayoutInflater.inflate(R.layout.itemview_trend,parent,false)); case FOOT_TYPE: return new FootViewHolder(mLayoutInflater.inflate(R.layout.trend_bottom,parent,false)); default: return null; } }
拿到不同的holder生產具體實現:
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof HeadViewHolder) { }else if (holder instanceof BodyViewHolder) { ((BodyViewHolder) holder).body.setText((CharSequence) listData.get(position-headCount)); }else if (holder instanceof FootViewHolder) { } }
怎么樣是不是很簡單?其實還可以拓展實現更多樣式的item只需要我們設置itemtype和位置就可以了。最后附上完整代碼。
public class HBRecycleViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private static final int HEAD_TYPE=00001; private static final int BODY_TYPE=00002; private static final int FOOT_TYPE=00003; private int headCount=1;//頭部個數,后續可以自己拓展 private int footCount=1;//尾部個數,后續可以自己拓展 private LayoutInflater mLayoutInflater; private List<T>listData=new ArrayList<>(); public HBRecycleViewAdapter(Context context,List<T>listData) { //this.context=context; mLayoutInflater=LayoutInflater.from(context); this.listData=listData; } private int getBodySize() { return listData.size(); } private boolean isHead(int position) { return headCount!=0&&position<headCount; } private boolean isFoot(int position) { return footCount!=0&&(position>=(getBodySize()+headCount)); } @Override public int getItemViewType(int position) { if (isHead(position)) { return HEAD_TYPE; }else if (isFoot(position)) { return FOOT_TYPE; }else { return BODY_TYPE; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case HEAD_TYPE: return new HeadViewHolder(mLayoutInflater.inflate(R.layout.trend_head,parent,false)); case BODY_TYPE: return new BodyViewHolder(mLayoutInflater.inflate(R.layout.itemview_trend,parent,false)); case FOOT_TYPE: return new FootViewHolder(mLayoutInflater.inflate(R.layout.trend_bottom,parent,false)); default: return null; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof HeadViewHolder) { }else if (holder instanceof BodyViewHolder) { ((BodyViewHolder) holder).body.setText((CharSequence) listData.get(position-headCount)); }else if (holder instanceof FootViewHolder) { } } @Override public int getItemCount() { return headCount+getBodySize()+footCount; } private static class HeadViewHolder extends RecyclerView.ViewHolder{ public HeadViewHolder(View itemView) { super(itemView); } } private static class BodyViewHolder extends RecyclerView.ViewHolder{ TextView body; public BodyViewHolder(View itemView) { super(itemView); body= (TextView) itemView.findViewById(R.id.tv_body); } } private static class FootViewHolder extends RecyclerView.ViewHolder { public FootViewHolder(View itemView) { super(itemView); } } }