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 ...
随机推荐
- redis 学习资料
redis 学习资料 网址 Redis 教程(菜鸟教程) http://www.runoob.com/redis/redis-tutorial.html Redis 命令参考 http://redis ...
- 关于meshgrid和numpy.c_以及numpy.r_
meshgrid的目的是生成两套行列数一致的矩阵,其中一个是行重复,一个是列复制:可以这么来理解,通过ravel()将矩阵数据拉平之后,就可以将这两套矩阵累加在一起,形成一个两行数据,要达到这个效果是 ...
- Ambari对HDP的版本支持列表
截至目前最新的Ambari版本为2.6: https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.3/bk_support-matrices/co ...
- CentOS6.4 添加php-fpm系统服务
简介: php-fpm安装完成后默认不会注册为系统服务,所以需要手工添加系统服务脚本.在/etc/init.d目录下新建php-fpm文件,并更改权限其即可. 1.检测/usr/local/php/v ...
- Vivado HLS初识---阅读《vivado design suite tutorial-high-level synthesis》(2)
Vivado HLS初识---阅读<vivado design suite tutorial-high-level synthesis>(2) 1.实验目的 2.启动命令行 将命令行切换 ...
- js跨域调用mvc ActionResult扩展
背景 最近2个项目中都用到了js跨域访问的知识,2个项目都需要主站与各个分站之间进行数据交互.状态同步等相关操作.浏览器本身是不允许进行跨域访问,在MVC中我们可以扩展一个方法来实现这个功能.在此大家 ...
- asp.net core项目 部署在 linux上
第一步 安装 .net core https://www.microsoft.com/net/learn/get-started/linuxubuntu 第二步 运行你的asp.net core 项目 ...
- P2799国王的魔镜
链接 想了好久(蒟蒻的不能蒟蒻) 题解: #include<iostream>#include<cstdio>#include<cstring>#include&l ...
- Dubbo(6)Dubbo服务集群实现负载均衡
什么时候用到集群?比如说某个服务,并发量特别大的时候就会用到集群: 具体的话比如说,某些特殊的项目一天的注册量10万,国家的一些考试系统,集中在几天,注册量一天10万,如果只弄一个服务,根本服务不过来 ...
- Java-Runoob-高级教程-实例-方法:04. Java 实例 – 斐波那契数列
ylbtech-Java-Runoob-高级教程-实例-方法:04. Java 实例 – 斐波那契数列 1.返回顶部 1. Java 实例 - 斐波那契数列 Java 实例 斐波那契数列指的是这样一 ...