2.Android RecyclerView 手把手教你打造万能适配器BaseRecyclerViewAdapterHelper

今天开始讲RecycleView的系列教程。分割线,分组,局部刷新,动态添加,缓存原理,抖音效果,瀑布流。嵌套,动画等等


第三方万能适配器:

            compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22'

本文就是模仿这个,看了源码,一步一步写的

支持多类型

支持下拉和上拉更多

支持动态添加和删除

支持头部

支持点击事件

支持动画

使用超简单

背景

1.重复写4个方法和绑定过程,hold等,代码太多了

2.需要自己写点击事件的监听

3.没有使用adapter之前,使用万能adapter之后,代码少了不少!

数据怎么办?布局怎么办? 绑定怎么办?。

1.将List的泛型参数转移到Adapter中:                            泛型类

2.封装 getCount、getItem、getItemId方法

3.封装ViewHolder,并解决不同布局控件不统一问题       布局通过type传入

通用ViewHolder需要找到相应的控件                                通过泛型方法找到控件,tv,image。调用通过settext,setimager区分。

通用ViewHolder需要提供方法来设置相应控件的内容

数据决定采用泛型,布局打算直接构造传第,绑定显示效果肯定就只能回传。

封装步骤:

1.把数据封装

2.把控件封装

3.封装多类型

4.封装点击事件

总结:主要分装ViewHodler。


publicabstractclassBaseRecyclerViewAdapter<T>extendsRecyclerView.Adapter<MyViewHolder>{

privateList<T>mList;//数据源

protectedLayoutInflatermInflater;

privateContextmContext;

// 布局怎么办?直接从构造里面传递

privateintmLayoutId;

// 多布局支持

privateMultiTypeSupportmMultiTypeSupport;

publicBaseRecyclerViewAdapter(List<T>mList,Contextcontext,intlayoutId) {

this.mList=mList;

this.mContext=context;

this.mInflater=LayoutInflater.from(mContext);

this.mLayoutId=layoutId;

    }

publicBaseRecyclerViewAdapter(List<T>mList,Contextcontext,MultiTypeSupportmMultiTypeSupport) {

this(mList,context,-1);

this.mMultiTypeSupport=mMultiTypeSupport;

    }

@NonNull

@Override

publicMyViewHolderonCreateViewHolder(@NonNullViewGroupparent,intviewType) {

if(mMultiTypeSupport!=null){

mLayoutId=viewType;

        }

// 先inflate数据

ViewitemView=mInflater.inflate(mLayoutId,parent,false);

// 返回ViewHolder

MyViewHolderholder=newMyViewHolder(itemView);

returnholder;

    }

@Override

publicintgetItemViewType(intposition) {

if(mMultiTypeSupport!=null) {

returnmMultiTypeSupport.getLayoutId(mList.get(position),position);

        }

returnsuper.getItemViewType(position);

    }

@Override

publicvoidonBindViewHolder(@NonNullMyViewHolderholder,intposition) {

// 设置点击和长按事件

if(mItemClickListener!=null) {

holder.itemView.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(Viewv) {

mItemClickListener.onItemClick(position);

                }

            });

        }

if(mLongClickListener!=null) {

holder.itemView.setOnLongClickListener(newView.OnLongClickListener() {

@Override

publicbooleanonLongClick(Viewv) {

returnmLongClickListener.onLongClick(position);

                }

            });

        }

convert(holder,mList.get(position));

    }

/**

    * 利用抽象方法回传出去,每个不一样的Adapter去设置

    *

    * @param item 当前的数据

    */

publicabstractvoidconvert(MyViewHolderholder,Titem);

@Override

publicintgetItemCount() {

returnmList.size();

    }

/***************

    * 设置条目点击和长按事件

    *********************/

publicOnItemClickListenermItemClickListener;

publicOnLongClickListenermLongClickListener;

publicvoidsetOnItemClickListener(OnItemClickListeneritemClickListener) {

this.mItemClickListener=itemClickListener;

    }

publicvoidsetOnLongClickListener(OnLongClickListenerlongClickListener) {

this.mLongClickListener=longClickListener;

    }

}


publicinterfaceMultiTypeSupport<T>{

// 根据当前位置或者条目数据返回布局

publicintgetLayoutId(Titem,intposition);

}

使用的时候,传递多类型的布局id。然后设置控件的id


publicclassPengAdapterextendsBaseRecyclerViewAdapter<String>{

publicPengAdapter(List<String>mList,Contextcontext,intlayoutId) {

super(mList,context,layoutId);

    }

publicPengAdapter(List<String>mList,Contextcontext,MultiTypeSupportmMultiTypeSupport) {

super(mList,context,mMultiTypeSupport);

    }

@Override

publicvoidconvert(MyViewHolderholder,Stringitem) {

holder.setText(R.id.tv_content,item);

    }

}


demo地址:https://github.com/pengcaihua123456/shennandadao

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容