因为要撸库 所有参考了很多adapter库的代码 但是都发现一个问题 star前5的的Recycler Adapter库的Header Footer要么只能添加一次(在这里面添加删除view),要么添加之后删除会错位
为什么会错位呢?因为他们用List mHeaderViews的position 映射后当getType的值。
当删除一个headView的时候postion则会错位。如果做这样的以一个操作 删除头部然后添加另一个头部。布局不同。那么会发现视图根本不会改变还是原来的头部布局。因为getType的没变的缘故。
当然可以通过其他的方式 让position不错位。具体可看 ZAdapter3的1.0分支。但是还是有问题 滚动动画会出现奇怪的问题。所以弃用!
怎么改变这一现状能让添加头部和尾部如同listView一样呢。参考了ListView发现所有类型都是一个;而后我有想到 viewHold的机制其实就是复用。那我给头部和尾部都添加一个空的FrameLayout。然后在bindView是头尾的时候 removeAllViews,和addView(header/footer) 不就可以了吗?
这里我给出关键性代码:
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| public static final int ITEM_VIEW_TYPE_HEADER_OR_FOOTER = -3;
//Limit one thousand private List<ViewDelegates> mHeaderViews = new ArrayList<>(); private List<ViewDelegates> mFooterViews = new ArrayList<>();
@Override public Holder onCreateViewHolder(final ViewGroup parent, int viewType) { if (viewType == ITEM_VIEW_TYPE_HEADER_OR_FOOTER) { QuickConfig.e("onCreateViewHolder header or footer :" + viewType); return new Holder(setFullspan(LayoutInflater.from(context) .inflate(R.layout.base_vp, mRecyclerView, false))); } ... } /** * @return layoutid * 因为getItemViewType不同 导致 头部底部view不会被重用! */ @Override public int getItemViewType(int position) { ... if (position >= getHeaderViewsCount() && position < getHeaderViewsCount() + data.size()) { QuickConfig.e("getItemViewType views:" + position); int result = getItemViewType2(getDataPosition(position)); if (result == ITEM_VIEW_TYPE_HEADER_OR_FOOTER) throw new IllegalStateException("layoutType is must not be" + ITEM_VIEW_TYPE_HEADER_OR_FOOTER); return result; } else { QuickConfig.e("getItemViewType healder or footer:" + position); return ITEM_VIEW_TYPE_HEADER_OR_FOOTER; } }
@Override public void onBindViewHolder(Holder holder, int position) { if (isEmptyData()) return; if (position >= mHeaderViews.size() && position < mHeaderViews.size() + data.size()) { if (holder.wrapper != null) holder.wrapper.getViewDelegates().fillData( position, data.get(getDataPosition(position)), holder.helper); } else if (position < mHeaderViews.size()) { QuickConfig.e("bind header position:" + position); bindHFView((ViewGroup) holder.itemView, mHeaderViews.get(position).getItemView()); } else { QuickConfig.e("bind footer position:" + position); bindHFView((ViewGroup) holder.itemView, mFooterViews.get(position - getHeaderViewsCount() - data.size()).getItemView()); } }
private void bindHFView(ViewGroup parent, View child) { parent.removeAllViews(); ViewGroup vp = (ViewGroup) child.getParent(); if (vp != null) vp.removeAllViews(); parent.addView(child); }
|