安卓

2.Android RecyclerView 手把手教你打

2021-06-27  本文已影响0人  鹏城十八少

从月薪3000到年薪60万。从专科生到深圳一线大厂。关注我就能达到大师级水平,这话我终于敢说了, 年薪60万不是梦!

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

上一篇下一篇

猜你喜欢

热点阅读