今天开始讲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);
}
}