赞
踩
1、2020 年 4 月 1 日1.2.0-alpha02中官方增加了ConcatAdapter(这时候还叫MergeAdapter)。
2、 2020 年 6 月 24 日发布的androidx.recyclerview:recyclerview:1.2.0-alpha04版本,将MergeAdapter重命名为ConcatAdapter。
ConcatAdapter是可以线性组合多个适配器的新 RecyclerView 适配器。
官方提供的用法如下:
MyAdapter adapter1 = ...;
AnotherAdapter adapter2 = ...;
ConcatAdapter concatAdapter = new ConcatAdapter(adapter1, adapter2);
recyclerView.setAdapter(concatAdapter);
我的demo中是这么用的:
//设置为垂直线性布局 rvList.setLayoutManager(new LinearLayoutManager(mContext)); ConcatAdapter adapter = new ConcatAdapter(); headerAdapter = new HeaderAdapter(headerData); contentAdapter = new ContentAdapter(contentData); footerAdapter = new FooterAdapter(); //添加不同的适配器 adapter.addAdapter(headerAdapter); adapter.addAdapter(contentAdapter); adapter.addAdapter(footerAdapter); //设置适配器 rvList.setAdapter(adapter); //添加DividerItemDecoration DividerItemDecoration decoration = new DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL); decoration.setDrawable(ContextCompat.getDrawable(mContext, R.drawable.divider_bg)); //设置itemDecoration rvList.addItemDecoration(decoration);
设置条目的点击事件:
public class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ViewHolder> { ...... @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { ...... holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //获取当前点击的条目position int bindingAdapterPosition = holder.getBindingAdapterPosition(); if(onItemClickListener != null) { onItemClickListener.onItemClick(v, bindingAdapterPosition); } } }); } ...... }
holder.getBindingAdapterPosition()获取的位置为ContentAdapter中的position,如果要获取在ConcatAdapter中的position,则可以调用holder.getAbsoluteAdapterPosition()即可。
效果如下图所示:
嗯,图片有些丑,不过能说明问题就好。
使用需要注意的事项:
1、通过ConcatAdapter.addAdapter()添加适配器的顺序,和列表中显示顺序是一致的。
2、对于不确定性的,动态类型的复杂视图,ContactAdapter是无法处理的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。