博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecyclerView.Adapter封装,最简单实用的BaseRecyclerViewAdapter;只需重写一个方法,设置数据链式调用;...
阅读量:4661 次
发布时间:2019-06-09

本文共 4913 字,大约阅读时间需要 16 分钟。

之前对ListView的BaseAdapter进行过封装,只需重写一个getView方法;

现在慢慢的RecyclerView成为主流,下面是RecyclerView.Adapter的封装;

BaseRecyclerViewHolder类:

public class BaseRecyclerHolder extends RecyclerView.ViewHolder {    private SparseArrayCompat
mViews; public BaseRecyclerHolder(View itemView) { super(itemView); mViews = new SparseArrayCompat<>(); } public
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
extends RecyclerView.Adapter
{ public Context context; public int layoutRes; public List
items; public BaseRecyclerAdapter(Context context,@LayoutRes int layoutRes){ this.context = context; this.layoutRes = layoutRes; items = new ArrayList
(); } public BaseRecyclerAdapter(Context context,@LayoutRes int layoutResId, @Nullable List
data) { this.context = context; this.items = data == null ? new ArrayList
() : 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
items) { this.items = items == null ? new ArrayList
() : 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
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
datas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData();// ap = new BaseRecyclerAdapter
(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
{ 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
{ 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,里面封装的更加全面;

转载于:https://www.cnblogs.com/cuichen16/p/10785994.html

你可能感兴趣的文章