Android开发——如何实现RecyclerView通用适配器
来源:互联网 发布:淘宝卖家差评申诉 编辑:程序博客网 时间:2024/06/06 19:06
Android开发——如何实现RecyclerView通用适配器
http://www.mobile-open.com/2015/85170.html
本文主要讲述了如何实现RecyclerView通用适配器,如何绑定监听器,现在把实现方式整理出来分享给Android程序员兄弟们,希望给他们的开发工作带来帮助。
分析
- 我们需要在RecyclerViewAdapter内部维持一个数据集合的引用
- 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法
- 这个适配器必须通用,所以应该是泛型的,并且ViewHolder也是通用的,可以采用SparseArray维持View的所有集合
- 在RecyclerViewAdapter内部需要实现数据的绑定(抽象方法,延迟到子类实现),监听器的绑定
编写监听器
分为短按事件和长按事件
- 短按监听器
package cn.edu.zafu.base.adapter.listener;import android.view.View;/** * Created by lizhangqu on 2015/6/3. */public interface OnItemClickListener<T> { void onClick(View view, T item);}
- 长按监听器
package cn.edu.zafu.base.adapter.listener;import android.view.View;/** * Created by lizhangqu on 2015/6/3. */public interface OnItemLongClickListener<T> { void onLongClick(View view, T item);}
编写通用适配器
- 设置监听器
package cn.edu.zafu.base.adapter;import android.support.v7.widget.RecyclerView;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import java.util.List;import cn.edu.zafu.base.adapter.listener.OnItemClickListener;import cn.edu.zafu.base.adapter.listener.OnItemLongClickListener;/** * this is a BaseAdapter for RecyclerView * author lizhangqu * version 1.0 * date 2015/6/3. */public abstract class BaseRecyclerViewAdapter<T, VH extends BaseRecyclerViewAdapter.SparseArrayViewHolder> extends RecyclerView.Adapter<VH> { /** * click listener */ protected OnItemClickListener mOnItemClickListener; /** * long click listener */ protected OnItemLongClickListener mOnItemLongClickListener; /** * set a long click listener * * @param onItemLongClickListener */ public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { mOnItemLongClickListener = onItemLongClickListener; } /** * set a click listener * * @param onItemClickListener */ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; }}
- 编写构造方法,将数据集合进行赋值
/** * data */ protected List<T> mList; /** * @param list the datas to attach the adapter */ public BaseRecyclerViewAdapter(List<T> list) { mList = list; }
实现几个必要的方法,比如获得Item以及覆写getItemCount方法
/** * get a item by index * * @param position * @return */protected T getItem(int position) { return mList.get(position);}@Overridepublic int getItemCount() { return mList.size();}
- 实现将布局文件映射成View的方法
/** * inflate a view by viewgroup ,id ,etc * * @param viewGroup * @param layoutId * @return */ protected View inflateItemView(ViewGroup viewGroup, int layoutId) { return inflateItemView(viewGroup, layoutId, false); } /** * inflate a view by viewgroup ,id ,etc * * @param viewGroup * @param layoutId * @param attach * @return */ protected View inflateItemView(ViewGroup viewGroup, int layoutId, boolean attach) { return LayoutInflater.from(viewGroup.getContext()).inflate(layoutId, viewGroup, attach); }
实现onBindViewHolder方法,这一步很重要,将具体实现抽取到两个方法中去实现,bindDataToItemView是一个抽象方法,延迟到子类实现,bindItemViewClickListener方法设置监听器
/** * a final function to avoid you override * use template design pattern * * @param vh * @param position */ @Override public final void onBindViewHolder(VH vh, int position) { final T item = getItem(position); bindDataToItemView(vh, item); bindItemViewClickListener(vh, item); } /** * bind data to itemview * * @param vh viewholder * @param item item */ protected abstract void bindDataToItemView(VH vh, T item); /** * bind click listner to itemview * * @param vh viewholder * @param item item */ protected final void bindItemViewClickListener(VH vh, final T item) { if (mOnItemClickListener != null) { vh.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mOnItemClickListener.onClick(view, item); } }); } if (mOnItemLongClickListener != null) { vh.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemLongClickListener.onLongClick(v, item); return true; } }); } }
- 实现通用ViewHolder,内部使用SparseArray维持View对象
public static class SparseArrayViewHolder extends RecyclerView.ViewHolder { private final SparseArray<View> views; public SparseArrayViewHolder(View itemView) { super(itemView); views = new SparseArray<View>(); } public <T extends View> T getView(int id) { View view = views.get(id); if (view == null) { view = itemView.findViewById(id); views.put(id, view); } return (T) view; } }
内部实现了一个泛型的getView方法,其作用就是将View缓存至SparseArray中去
- 实现通用ViewHolder的一些属性设置方法,采用链式调用,返回this对象
public SparseArrayViewHolder setText(int viewId, String value) { TextView view = getView(viewId); view.setText(value); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setTextColor(int viewId, int textColor) { TextView view = getView(viewId); view.setTextColor(textColor); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setImageResource(int viewId, int imageResId) { ImageView view = getView(viewId); view.setImageResource(imageResId); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setBackgroundColor(int viewId, int color) { View view = getView(viewId); view.setBackgroundColor(color); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setBackgroundResource(int viewId, int backgroundRes) { View view = getView(viewId); view.setBackgroundResource(backgroundRes); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setVisible(int viewId, boolean visible) { View view = getView(viewId); view.setVisibility(visible ? View.VISIBLE : View.GONE); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setOnClickListener(int viewId, View.OnClickListener listener) { View view = getView(viewId); view.setOnClickListener(listener); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) { View view = getView(viewId); view.setOnTouchListener(listener); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) { View view = getView(viewId); view.setOnLongClickListener(listener); return SparseArrayViewHolder.this; } public SparseArrayViewHolder setTag(int viewId, Object tag) { View view = getView(viewId); view.setTag(tag); return SparseArrayViewHolder.this; }
源码
- 参见github地址:https://github.com/lizhangqu
0 0
- Android开发——如何实现RecyclerView通用适配器
- Android RecyclerView通用适配器
- android RecyclerView 通用适配器
- RecyclerView通用适配器的实现
- Android RecyclerView简单通用适配器
- Android开发之实现RecyclerView万能适配器
- RecyclerView通用适配器
- 通用的RecyclerView适配器.
- android开发之继承BaseAdapter实现通用数据适配器
- listview通用适配器和RecyclerView通用适配器
- 【Android】通用系列 —— AbsListView适配器
- Android进阶之通用RecyclerView适配器打造方法
- 打造RecyclerView的通用适配器
- 通用的RecyclerView Adapter适配器
- Android 开发技巧-Listview通用适配器BaseCommAdapter
- 让偷懒更彻底——用Butterknife 来为recyclerview 打造通用适配器(上)
- Android开发技巧——使用RecyclerView实现分组列表
- Android开发之实现水平滚动效果—RecyclerView
- 牛客网 | 最短子数组练习题
- freebcp (kshell 使用 freebcp 然后调用python,执行insert操作。当DB连接加密时,bcp失败)
- android导入项目出现style错误,menu错误
- 30.Insert Interval-插入区间(容易题)
- 03 代码编辑器-VsCode基础
- Android开发——如何实现RecyclerView通用适配器
- 【C#MVC】搭建.netMVC4工程(二)
- iOS在一个Label中展示不同颜色的text
- IOS与ReactNative
- Java多线程学习(吐血超详细总结)
- leetcode 29 Divide Two Integers(整数相除)
- android.database.StaleDataException: Attempted to access a cursor after it has been closed.
- [新闻摘录]云计算十年:OpenStack如何占据开源IaaS江湖老大的地位
- 持续集成(CI)、自动化构建和自动化测试--初探