RecyclerView.Adapter封装,最简单实用的BaseRecyclerViewAdapter;只需重写一个方法,设置数据链式调用;
之前对ListView的BaseAdapter进行过封装,只需重写一个getView方法;
现在慢慢的RecyclerView成为主流,下面是RecyclerView.Adapter的封装;
BaseRecyclerViewHolder类:
public class BaseRecyclerHolder extends RecyclerView.ViewHolder {
private SparseArrayCompat<View> mViews;
public BaseRecyclerHolder(View itemView) {
super(itemView);
mViews = new SparseArrayCompat<>();
}
public <V extends View> V getView(@IdRes int res){
View v = mViews.get(res);
if (v == null){
v = itemView.findViewById(res);
mViews.put(res,v);
}
return (V)v;
}
}
BaseRecyclerViewAdapter类:
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerHolder> {
public Context context;
public int layoutRes;
public List<T> items; public BaseRecyclerAdapter(Context context,@LayoutRes int layoutRes){
this.context = context;
this.layoutRes = layoutRes;
items = new ArrayList<T>();
} public BaseRecyclerAdapter(Context context,@LayoutRes int layoutResId, @Nullable List<T> data) {
this.context = context;
this.items = data == null ? new ArrayList<T>() : data;
if (layoutResId != 0) {
this.layoutRes = layoutResId;
}
} @Override
public BaseRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new BaseRecyclerHolder(LayoutInflater.from(context).inflate(layoutRes,null));
} @Override
public void onBindViewHolder(BaseRecyclerHolder holder, int position) {
convert(holder,position);
} @Override
public int getItemCount() {
return items.size();
} public void setData(List<T> items) {
this.items = items == null ? new ArrayList<T>() : items;
notifyDataSetChanged();
} public void addData(@IntRange(from = 0) int position, @NonNull T data) {
items.add(position, data);
notifyItemInserted(position);
compatibilityDataSizeChanged(1);
}
public void addData( @NonNull T data) {
items.add(data);
notifyItemInserted(items.size());
} public void remove(int position) {
items.remove(position);
int internalPosition = position;
notifyItemRemoved(internalPosition);
notifyItemRangeChanged(internalPosition, items.size() - internalPosition);
} private void compatibilityDataSizeChanged(int size) {
final int dataSize = items == null ? 0 : items.size();
if (dataSize == size) {
notifyDataSetChanged();
}
} /**
* 需要重写的方法
* @param holder
* @param position
*/
public abstract void convert(BaseRecyclerHolder holder, int position);
}
如何使用:MainActivity类:
public class MainActivity extends AppCompatActivity {
private final String TAG = this.getClass().getSimpleName();
private List<String> d = Arrays.asList(
"A","B","C","D","E","F","G"
,"H","I","J","K","L","M","N"
,"O","P","Q","R","S","T"
,"U","V","W","X","Y","Z");
private RecyclerView rv ;
private BaseRecyclerAdapter ap;
private List<String> datas; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
// ap = new BaseRecyclerAdapter<String>(MainActivity.this, R.layout.item_rv){
// 还可以这样用
// @Override
// public void convert(BaseRecyclerHolder holder, int position) {
//
// }
// };
rv = findViewById(R.id.rv);
rv.setLayoutManager(new GridLayoutManager(this,3));
ap = new Ap(this,R.layout.item_rv);
rv.setAdapter(ap);
ap.setData(datas);
} private void initData() {
datas = new ArrayList<>();
for (int i = 0; i < d.size(); i++) {
datas.add(d.get(i));
}
} class Ap extends BaseRecyclerAdapter<String>{ public Ap(Context c, int layoutRes) {
super(c, layoutRes);
} @Override
public void convert(BaseRecyclerHolder holder, final int position) {
//链式调用
holder.setText(R.id.tv,items.get(position))
.setOnClickListener(R.id.tv, new View.OnClickListener() {
@Override
public void onClick(View view) {
ap.remove(position);
}
});
}
} }
其实就只有这一个是你关注的,需要实现的Adapter:
class Ap extends BaseRecyclerAdapter<String>{ public Ap(Context c, int layoutRes) {
super(c, layoutRes);
} @Override
public void convert(BaseRecyclerHolder holder, final int position) {
//链式调用
holder.setText(R.id.tv,items.get(position))
.setOnClickListener(R.id.tv, new View.OnClickListener() {
@Override
public void onClick(View view) {
ap.remove(position);
}
});
}
}
是不是超简单:
这个是Demo,里面封装的更加全面;点击打开链接
RecyclerView.Adapter封装,最简单实用的BaseRecyclerViewAdapter;只需重写一个方法,设置数据链式调用;的更多相关文章
- c# 写个简单的爬虫。注:就一个方法,没有注释,自己猜~哈哈
和我,在成都的街头走一走,哦~喔~哦~ public JsonResult GetHtml() { string url = "http://www.xxxxxxxxxxxxxxxxxx.c ...
- 最新 AFNetworking 3.0 简单实用封装
AFNetworking 3.0 的到来使我们开发者又方便了许多,话不多说,直接上代码. 1.首先 引入框架AFNetworking框架 GitHub下载地址:https://github.com/A ...
- C# .NET Socket 简单实用框架,socket组件封装
参考资料 https://www.cnblogs.com/coldairarrow/p/7501645.html 根据.NET Socket 简单实用框架进行了改造,这个代码对socket通信封装还是 ...
- RecyclerView再封装
RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...
- Android RecyclerView Adapter 新式用法之SortedListAdapterCallback
引言 前几天在同事的提醒下发现V7中有了一个新的工具类SortedListAdapterCallback,配合RecyclerView Adapter和SortedList一起使用更加方便的管理我们在 ...
- 极简的Android RecyclerView Adapter(使用DataBinding)
阅读本篇文章需要读者对Android Databinding和RecyclerView有一定的了解. 简介 我们知道,DataBinding的核心理念是数据驱动.数据驱动驱动的目标就是View,使用D ...
- 孟老板 BaseAdapter封装 (一) 简单封装
BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...
- 在组件放使用v-model和slot插槽的简单实用
封装的组件(SelectDefault.vue文件): <template> <div class="select-default"> <label& ...
- 从头開始学 RecyclerView(三) 封装简化
前言 上一篇的代码,也是基于这些封装的. RV的封装,跟曾经的listView之类的封装,大同小异. 这里,从@devwiki 处,将代码搬过来.基本无改动 BaseHolder的优化 使ViewHo ...
随机推荐
- focus、input、keydown、keyup、change、blur方法的差异
focus.input.keydown.keyup.change.blur方法的差异: https://blog.csdn.net/yiifaa/article/details/52372022 bl ...
- 共用体union
union共用体名 { 类型名 成员名1: 类型名 成员名2: …… 类型名 成员名n; } 由于各个成员变量在内存中都使用同一段存储空间,因此共用体变量的长度等于最长的成员长度,共用体的访问方式和结 ...
- laravel 事务处理
//開啟事務 DB::beginTransaction(); try { //賬號密碼同步到後台登錄表 $user = new \App\Models\User; $user->name = $ ...
- 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink--容错机制(ACK,RDD,基于log和状态快照),消息处理at least once,exactly once两个是关键
分布式流处理是对无边界数据集进行连续不断的处理.聚合和分析.它跟MapReduce一样是一种通用计算,但我们期望延迟在毫秒或者秒级别.这类系统一般采用有向无环图(DAG). DAG是任务链的图形化表示 ...
- 1.初步认识TypeScript
简介:typescript是C#之父主导的一门语言,本质上是向Javascript语言添加了可选的静态类型和基于面向对象的诸多特性.相当于javascript的超集,其包含es6.由于是和C#之父创造 ...
- RedHat6.5安装zookeeper单机
版本号: Redhat6.5 zookeeper-3.4.6 JDK1.8 zookeeper下载 官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apac ...
- nginx只允许移动端访问( 判断拦截pc浏览器访问)
set $mobile_request '0'; if ($http_user_agent ~* (Android|webOS|iPhone|iPod|BlackBerry)) { set $mobi ...
- supervisor的安装部署及集群管理
supervisor的安装部署及集群管理 supervisor官网:http://www.supervisord.org/ 参考链接: http://blog.csdn.net/xyang81/art ...
- 测试教程网.unittest教程.7. 各种断言方法
From: http://www.testclass.net/pyunit/assert/ 背景 unittest支持各种断言方法. 断言列表 官方文档 方法 检查点 assertEqual(a, b ...
- 64位系统VBS调用32位COM组件
64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件作者: Demon链接: ht ...