优雅实现RecyclerView里面嵌套RecyclerView 您所在的位置:网站首页 recyclerview实现表格 优雅实现RecyclerView里面嵌套RecyclerView

优雅实现RecyclerView里面嵌套RecyclerView

2023-08-11 12:39| 来源: 网络整理| 查看: 265

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金

概念图

微信图片_20211008095418.jpg

定义实体类

首先定义三个实体类,分别表示全部记录(一级)、日期、全部记录(二级)

BillRecordsAllData BillRecordsDateTitle BillRecord

例如: 第一层的RecyclerView显示日期和全部记录 第二层的RecyclerView显示时间和金额数据

FirstAdapter

在FirstAdapter里面定义两个标签,用来标记日期标题和记录

/** ITEM 类型:日期标题 */ private static final int ITEM_TYPE_DATE_TITLE = 1; /** ITEM 类型:全部记录 */ private static final int ITEM_TYPE_RECORD = 2; getItemViewType()

接着在getItemViewType()里面判断

@Override public int getItemViewType(int position) { Object item = mDataList.get(position); return item instanceof BillRecord ? ITEM_TYPE_RECORD : ITEM_TYPE_DATE_TITLE; } onCreateViewHolder

这里用dataBinding演示,推荐大家使用,不要再写繁琐的findViewById()了 根据getItemViewType()返回的实体类型,在onCreateViewHolder抽象函数里面判断ViewHolder

@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE_RECORD) { return new FirstAHolder(RecyclerviewItemBillAllRecordsFirstLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); }else{ return new DateTitleViewHolder(RecyclerviewItemBillAllRecordsTitleLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); } } onBindViewHolder

onBindViewHolder用来绑定布局并且给二级RecyclerView设置Adapter

((FirstAHolder)holder).mRecyclerView.setLayoutManager(layoutManager); inAdapter = new BillAllRecordsSecondAdapter(((List)((BillRecordsAllData)item).getChildList()),((FragmentActivity)mActivity)); //inAdapter.setOnItemClickListener(OutAdapter.this);//在这里监听内部adapter ((FirstAHolder)holder).mRecyclerView.setAdapter(inAdapter);

完整代码

@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Object item = mDataList.get(position); if (holder instanceof DateTitleViewHolder && item instanceof BillRecordsDateTitle) { ((DateTitleViewHolder) holder).bind((BillRecordsDateTitle) item); } if (holder instanceof FirstAHolder && item instanceof BillRecordsAllData) { ((FirstAHolder) holder).bind(((BillRecordsAllData)item).getBillRecordsDateTitle()); LinearLayoutManager layoutManager = new LinearLayoutManager(mActivity); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); ((FirstAHolder)holder).mRecyclerView.setLayoutManager(layoutManager); inAdapter = new BillAllRecordsSecondAdapter(((List)((BillRecordsAllData)item).getChildList()),((FragmentActivity)mActivity)); //inAdapter.setOnItemClickListener(OutAdapter.this);//记得在这里监听内部adapter ((FirstAHolder)holder).mRecyclerView.setAdapter(inAdapter); } } RecyclerView.ViewHolder

创建两个ViewHolder,分别给记录日期和金额的布局绑定条目

/** 日期标题 ViewHolder */ private class DateTitleViewHolder extends RecyclerView.ViewHolder { private RecyclerviewItemBillAllRecordsTitleLayoutBinding mBinding; DateTitleViewHolder(RecyclerviewItemBillAllRecordsTitleLayoutBinding binding) { super(binding.getRoot()); mBinding = binding; } void bind(BillRecordsDateTitle title) { mBinding.setActivity(mActivity); mBinding.setData(title); mBinding.setVm(mViewModel); mBinding.executePendingBindings(); } } /** 记录 ViewHolder */ public class FirstAHolder extends RecyclerView.ViewHolder { private RecyclerviewItemBillAllRecordsFirstLayoutBinding itemAdapterBinding; private RecyclerView mRecyclerView; FirstAHolder(RecyclerviewItemBillAllRecordsFirstLayoutBinding binding) { super(binding.getRoot()); this.itemAdapterBinding = binding; //二级recyclerview mRecyclerView = itemAdapterBinding.recyclerview; } void bind(BillRecordsDateTitle record) { itemAdapterBinding.setActivity(mActivity); itemAdapterBinding.setData(record); itemAdapterBinding.setVm(mViewModel); itemAdapterBinding.executePendingBindings(); } }

一级搞定了,但还漏了动画,既然要优雅实现肯定要用DiffUtil啦

DiffUtil

DiffUtil.DiffResult抽象函数对应的逻辑

areItemsTheSame

定义什么情况下新老元素是同一个对象(通常是业务id)

areContentsTheSame

定义什么情况下同一对象内容是否相同 (由业务逻辑决定)

getChangePayload

具体定义同一对象内容是如何地不同 (返回值会作为payloads传入onBindViewHoder())

public void setDataList(final List


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有