美文网首页安卓
2.Android RecyclerView 手把手教你打

2.Android RecyclerView 手把手教你打

作者: 鹏城十八少 | 来源:发表于2021-06-27 09:26 被阅读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

    相关文章

      网友评论

        本文标题:2.Android RecyclerView 手把手教你打

        本文链接:https://www.haomeiwen.com/subject/awotultx.html