captain-miao / RecyclerViewUtils

[DEPRECATED] // RecyclerView Utils:refresh,load more,sticky header,expand,index
276 stars 68 forks source link

Should not be modified itemViewType #29

Closed androidWht closed 7 years ago

androidWht commented 7 years ago

supclass get item view type from RecyclerView.ViewHolder is not correct,not equals i provider in getContentViewType(int dataListIndex) method.i think should use other method to separate content view item type from header view type and footer view type without modification content item view type.

我english很差,你将就着看

captain-miao commented 7 years ago

那就用中文啊 -,-

是的,getContentViewType(int dataListIndex) 是实现方提供的值,getItemViewType(int position)返回的是RecyclerAdapter中的值,为了处理头部和尾部。使用这种方式,是为了实现像ListView一样增加头部和尾部。

    @Override
    public final int getItemViewType(int position) {
        //header view type
        if(mHeaderSize > 0 && position < mHeaderSize) {
            return HEADER_VIEW_TYPE_OFFSET + position;//header view has different viewType
        } else if(position >= mHeaderSize && position < getBasicItemCount() + mHeaderSize) {
            //content view type
            int contentViewType = getContentViewType(position - mHeaderSize);
            if(contentViewType >= 0) {
                return CONTENT_VIEW_TYPE_OFFSET + contentViewType;
            } else {
                throw new IllegalArgumentException("contentViewType must >= 0");
            }
        } else if(mFooterSize > 0 && position >= (getBasicItemCount() + mHeaderSize)
                                    && position < (getBasicItemCount() + mHeaderSize + mFooterSize)){
            //footer view type
            return FOOTER_VIEW_TYPE_OFFSET + (position - mHeaderSize - getBasicItemCount());//footer view has different viewType
        } else if (showLoadMoreView && position == (getBasicItemCount() + mHeaderSize + mFooterSize)) {
            //load more  view type
            return FOOTER_LOAD_MORE_VIEW_TYPE;
        }
        return INVALID_TYPE;
    }
androidWht commented 7 years ago

我的意思是,不应该修改实现类提供的getContentViewType(int dataListIndex)的值。因为这样使得实现类在通过RecyclerView.ViewHolder中调用getItemViewType()得到的值与其通过getContentViewType(int dataListIndex)提供的值不一致(增加了CONTENT_VIEW_TYPE_OFFSET的偏移量),这样相当于RecyclerView.ViewHolder的getItemViewType()失效了,破化了系统API。而做出这种修改的原因是想区分实现类了提供的viewType和添加的头部尾部的viewType,我的意思是不修改实现类提供的viewType,也能区分。比如可以限定实现类的viewType在[0,1000],父类强制做检查不符合可以抛异常,头部和尾部的viewType是父类自定义的,可以定义在1000以上。不知道我说的对不对! 我觉得像LoadMoreView这样的功能不应该由BaseWrapperRecyclerView来提供,应该创建一个继承自BaseWrapperRecyclerView类来提供。

captain-miao commented 7 years ago

👍 说的对啊~

但是 这个Utils的目标是简化开发,目标不是灵活适配。

哈哈,你可以fork玩玩。