优雅实现RecyclerView里面嵌套RecyclerView | 您所在的位置:网站首页 › recyclerview实现表格 › 优雅实现RecyclerView里面嵌套RecyclerView |
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金 概念图首先定义三个实体类,分别表示全部记录(一级)、日期、全部记录(二级) 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)); } } onBindViewHolderonBindViewHolder用来绑定布局并且给二级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啦 DiffUtilDiffUtil.DiffResult抽象函数对应的逻辑 areItemsTheSame定义什么情况下新老元素是同一个对象(通常是业务id) areContentsTheSame定义什么情况下同一对象内容是否相同 (由业务逻辑决定) getChangePayload具体定义同一对象内容是如何地不同 (返回值会作为payloads传入onBindViewHoder()) public void setDataList(final List |
CopyRight 2018-2019 实验室设备网 版权所有 |