分析

我们需要在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 {

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 {

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 extends RecyclerView.Adapter {

/**

* 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 mList;

/**

* @param list the datas to attach the adapter

*/

public BaseRecyclerViewAdapter(List list) {

mList = list;

}

实现几个必要的方法,比如获得Item以及覆写getItemCount方法

/**

* get a item by index

*

* @param position

* @return

*/

protected T getItem(int position) {

return mList.get(position);

}

@Override

public 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 views;

public SparseArrayViewHolder(View itemView) {

super(itemView);

views = new SparseArray();

}

public 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;

}

源码

Android适配器以及作用,Android RecyclerView 通用适配器的实现相关推荐

  1. android怎么设置适配器,Android之自定义实现BaseAdapter(通用适配器三)

    在上一篇中,我们说过,在setData中如果有很多控件的话,我们还是要在该方法中写入很多代码,为了降低开发的方便性,本次就在此基础上再一次优化.实现原理是这样的,每次在setData中都要查找控件,然 ...

  2. android布局的作用,Android UI布局经验总结

    如何在Android中动态设置颜色透明?10%20%到100% Android布局分析工具HierarchyView Android使用include/merge/ViewStub优化布局 List的 ...

  3. android 混淆规则作用,Android混淆规则

    简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码 ...

  4. android minheight的作用,Android 自定义 View 最少必要知识

    1. 什么是自定义 View? 1.1 定义 在 Android 系统中,界面中所有能看到的元素都是 View.默认情况下,Android 系统为开发者提供了很多 View,比如用于展示文本信息的 T ...

  5. Android监听作用,Android开发之CheckBox的简单使用与监听功能示例

    本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...

  6. android scaletype没作用,Android ImageView的ScaleType属性

    参考 ScaleType属性 常量 含义 fitXY 横向.纵向独立缩放,以适应该ImageView fitCenter 保持纵横比缩放图片,缩放完成后将图片放在ImageView的中央 fitSta ...

  7. android scaletype没作用,Android源码系列之深入理解ImageView的ScaleType属性

    做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button.TextView.ImageView等.如果你问我具体使用,我会给说:拿ImageView来说吧,首先创建一个新的项 ...

  8. android scaletype没作用,Android ImageView 的scaleType 属性图解

    ImageView 是 Android 中最常用的控件之一,而在使用ImageView时,必不可少的会使用到它的scaleType属性.该属性指定了你想让ImageView如何显示图片,包括是否进行缩 ...

  9. u盘里android文件夹作用,Android应用开发android tv box ---- 插入u盘直接播放指定文件夹中的视频...

    本文将带你了解Android应用开发android tv box ---- 插入u盘直接播放指定文件夹中的视频,希望本文对大家学Android有所帮助. android tv box ---- 插入u ...

最新文章

  1. NFS的access denied
  2. Python中的注释
  3. Python多线程——递归锁RLOCK
  4. awk分析nginx日志里面的接口响应时间
  5. Ubuntu18.04安装opencv出现的一系列问题解决方法(持续更新~)
  6. numpy tricks(二)—— 删除多维数组的行或列
  7. cc1 transform链
  8. 第三方系统平台如何对接gooflow2.0
  9. Qt之QTreeView的简单使用(含源码+注释)
  10. 2.8数据-paddlepaddle数据集uci_housing
  11. iOS——Segue的使用
  12. PC端 VUE 官网项目 前端开发 响应式布局(宽+高 等比例缩放)
  13. 商品模块的业务流程图
  14. Flume avro client和hdfs sink 完成自定义目录文件收集
  15. 小丁带你走进git世界一-git简单配置
  16. 咱们玩家最幽默(关于《无极》)
  17. 【Node】一个完整的 node addon 实现流程
  18. 计算机开机桌面黑屏怎么办,小编教你电脑启动后黑屏该怎么办
  19. 2.1微信小程序--比较数字大小
  20. lucene ---- 黑马教程

热门文章

  1. QListWidget读取本地文件夹中文件并显示名字,双击读取xml数据
  2. android SQLite数据库用法图文详解(附源码)
  3. mmTrix大数据分析平台构建实录--转
  4. redis 模糊删除实现
  5. spring源码分析之spring-jms模块详解
  6. Android Studio 分析器详解
  7. 多标签文本分类 [ALBERT](附代码)
  8. 马云缺席的一个半小时,李彦宏和马化腾都聊了什么
  9. 快递信息css3手风琴代码_用纯CSS实现手风琴效果的示例代码
  10. MySQL-主从架构的搭建