之前对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,里面封装的更加全面;点击打开链接

GitHub

RecyclerView.Adapter封装,最简单实用的BaseRecyclerViewAdapter;只需重写一个方法,设置数据链式调用;的更多相关文章

  1. c# 写个简单的爬虫。注:就一个方法,没有注释,自己猜~哈哈

    和我,在成都的街头走一走,哦~喔~哦~ public JsonResult GetHtml() { string url = "http://www.xxxxxxxxxxxxxxxxxx.c ...

  2. 最新 AFNetworking 3.0 简单实用封装

    AFNetworking 3.0 的到来使我们开发者又方便了许多,话不多说,直接上代码. 1.首先 引入框架AFNetworking框架 GitHub下载地址:https://github.com/A ...

  3. C# .NET Socket 简单实用框架,socket组件封装

    参考资料 https://www.cnblogs.com/coldairarrow/p/7501645.html 根据.NET Socket 简单实用框架进行了改造,这个代码对socket通信封装还是 ...

  4. RecyclerView再封装

    RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...

  5. Android RecyclerView Adapter 新式用法之SortedListAdapterCallback

    引言 前几天在同事的提醒下发现V7中有了一个新的工具类SortedListAdapterCallback,配合RecyclerView Adapter和SortedList一起使用更加方便的管理我们在 ...

  6. 极简的Android RecyclerView Adapter(使用DataBinding)

    阅读本篇文章需要读者对Android Databinding和RecyclerView有一定的了解. 简介 我们知道,DataBinding的核心理念是数据驱动.数据驱动驱动的目标就是View,使用D ...

  7. 孟老板 BaseAdapter封装 (一) 简单封装

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  8. 在组件放使用v-model和slot插槽的简单实用

    封装的组件(SelectDefault.vue文件): <template> <div class="select-default"> <label& ...

  9. 从头開始学 RecyclerView(三) 封装简化

    前言 上一篇的代码,也是基于这些封装的. RV的封装,跟曾经的listView之类的封装,大同小异. 这里,从@devwiki 处,将代码搬过来.基本无改动 BaseHolder的优化 使ViewHo ...

随机推荐

  1. 数据结构(c语言版)代码

    第1章  绪论       文档中源码及测试数据存放目录:数据结构\▲课本算法实现\▲01 绪论  概述        第一章作为绪论,主要介绍了数据结构与算法中的一些基本概念和术语.对于这些概念术语 ...

  2. mysql之 重建GTID下主从关系

    主库:mysqldump -uroot -pmysql -S /tmp/mysql.sock1 --single-transaction --add-drop-database --master-da ...

  3. navicat外键设置

    https://blog.csdn.net/qq_32486599/article/details/73497810

  4. python3 TypeError: Unicode-objects must be encoded before hashing

    python3下,利用hash值对字符串进行md5加密时报错:TypeError: Unicode-objects must be encoded before hashing 原因是:python3 ...

  5. java-shiro登录验证

    登录验证: LoginController:(LoginController.java) @ResponseBody @RequestMapping(value="/login", ...

  6. spring-AOP框架(基于配置文件的方式配置AOP)

    .xml: ref-指向,order-指定优先级

  7. Java 笔试题(一)

    应聘Java笔试时可能出现问题及其答案  Java基础方面: 1.作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 ...

  8. RedHat6.5如何被windows系统远程桌面连接

    一.redhat 6.5远程桌面配置 服务器端: 1.设置允许其它人查看您的远程桌面 在“系统”-“首选项”-“远程桌面”-在“允许其它人查看您的远程桌面”前打勾:在“允许其它用户控制您的桌面”打勾 ...

  9. TransportClient 新建index,mappings dynamic_templates。

    public void createIndex(TransportClient client, String index){ CreateIndexRequest request = new Crea ...

  10. vivado各版本的区别

    vivado各版本的区别 Vivado HL Design Edition: Vivado HL System Edition: 区别在于System Edition包含有system generat ...