转载自http://www.cnblogs.com/liushilin/p/5720926.html

由于RecyclerView的Adapter必须继承自RecyclerView.Adapter,并且指定我们写的ViewHolder为泛型,为了达到万能的效果,我们把需要传入的Java Bean属性直接用一个泛型T指代。

下面这些值得你注意:

1)RecyclerView没有提供Item的点击事件,所以我们需要自己自定义,建议实现在Adapter中,因为adapter里面会用到ViewHolder,这样有助用我们写每一项的点击事件。

2)RecyclerView不仅支持全局刷新,而且支持局部刷新,所以我们建议把添加和删除的方法直接写在Adapter中。

3)我们为了达到万能的效果,所以我们把设置holder的方法作为一个抽象方法,方面我们通过viewId传值到相应的控件中,把整个Adapter变成一个抽象方法,这样在子类中就可以去通过强制实现的方式把我们的数据填充进去。

还是直接看源码吧。

  1. package com.example.nanchen.commonadaperrecyclerdemo;
  2.  
  3. import android.content.Context;
  4. import android.support.v7.widget.RecyclerView;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8.  
  9. import java.util.List;
  10.  
  11. /**
  12. * 万能的RecyclerView适配器
  13. * Created by 南尘 on 16-7-30.
  14. */
  15. public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerHolder> {
  16.  
  17. private Context context;//上下文
  18. private List<T> list;//数据源
  19. private LayoutInflater inflater;//布局器
  20. private int itemLayoutId;//布局id
  21. private boolean isScrolling;//是否在滚动
  22. private OnItemClickListener listener;//点击事件监听器
  23. private OnItemLongClickListener longClickListener;//长按监听器
  24. private RecyclerView recyclerView;
  25.  
  26. //在RecyclerView提供数据的时候调用
  27. @Override
  28. public void onAttachedToRecyclerView(RecyclerView recyclerView) {
  29. super.onAttachedToRecyclerView(recyclerView);
  30. this.recyclerView = recyclerView;
  31. }
  32.  
  33. @Override
  34. public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
  35. super.onDetachedFromRecyclerView(recyclerView);
  36. this.recyclerView = null;
  37. }
  38.  
  39. /**
  40. * 定义一个点击事件接口回调
  41. */
  42. public interface OnItemClickListener {
  43. void onItemClick(RecyclerView parent, View view, int position);
  44. }
  45.  
  46. public interface OnItemLongClickListener {
  47. boolean onItemLongClick(RecyclerView parent, View view, int position);
  48. }
  49.  
  50. /**
  51. * 插入一项
  52. *
  53. * @param item
  54. * @param position
  55. */
  56. public void insert(T item, int position) {
  57. list.add(position, item);
  58. notifyItemInserted(position);
  59. }
  60.  
  61. /**
  62. * 删除一项
  63. *
  64. * @param position 删除位置
  65. */
  66. public void delete(int position) {
  67. list.remove(position);
  68. notifyItemRemoved(position);
  69. }
  70.  
  71. public BaseRecyclerAdapter(Context context, List<T> list, int itemLayoutId) {
  72. this.context = context;
  73. this.list = list;
  74. this.itemLayoutId = itemLayoutId;
  75. inflater = LayoutInflater.from(context);
  76.  
  77. // recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
  78. // @Override
  79. // public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
  80. // super.onScrollStateChanged(recyclerView, newState);
  81. // isScrolling = !(newState == RecyclerView.SCROLL_STATE_IDLE);
  82. // if (!isScrolling) {
  83. // notifyDataSetChanged();
  84. // }
  85. // }
  86. // });
  87. }
  88.  
  89. @Override
  90. public BaseRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  91. View view = inflater.inflate(itemLayoutId, parent, false);
  92. return BaseRecyclerHolder.getRecyclerHolder(context, view);
  93. }
  94.  
  95. @Override
  96. public void onBindViewHolder(final BaseRecyclerHolder holder, int position) {
  97.  
  98. if (listener != null){
  99. holder.itemView.setBackgroundResource(R.drawable.recycler_bg);//设置背景
  100. }
  101. holder.itemView.setOnClickListener(new View.OnClickListener() {
  102. @Override
  103. public void onClick(View view) {
  104. if (listener != null && view != null && recyclerView != null) {
  105. int position = recyclerView.getChildAdapterPosition(view);
  106. listener.onItemClick(recyclerView, view, position);
  107. }
  108. }
  109. });
  110.  
  111. holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
  112. @Override
  113. public boolean onLongClick(View view) {
  114. if (longClickListener != null && view != null && recyclerView != null) {
  115. int position = recyclerView.getChildAdapterPosition(view);
  116. longClickListener.onItemLongClick(recyclerView, view, position);
  117. return true;
  118. }
  119. return false;
  120. }
  121. });
  122.  
  123. convert(holder, list.get(position), position, isScrolling);
  124.  
  125. }
  126.  
  127. @Override
  128. public int getItemCount() {
  129. return list == null ? 0 : list.size();
  130. }
  131.  
  132. public void setOnItemClickListener(OnItemClickListener listener) {
  133. this.listener = listener;
  134. }
  135.  
  136. public void setOnItemLongClickListener(OnItemLongClickListener longClickListener) {
  137. this.longClickListener = longClickListener;
  138. }
  139.  
  140. /**
  141. * 填充RecyclerView适配器的方法,子类需要重写
  142. *
  143. * @param holder ViewHolder
  144. * @param item 子项
  145. * @param position 位置
  146. * @param isScrolling 是否在滑动
  147. */
  148. public abstract void convert(BaseRecyclerHolder holder, T item, int position, boolean isScrolling);
  149. }

其他的代码就很简单了,java bean类Data和布局和昨天一样的,大家可以自己去随便怎么布局。

这里只上一个MainActivity的代码

  1. package com.example.nanchen.commonadaperrecyclerdemo;
  2.  
  3. import android.os.Bundle;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.support.v7.widget.LinearLayoutManager;
  6. import android.support.v7.widget.RecyclerView;
  7. import android.view.View;
  8. import android.widget.EditText;
  9. import android.widget.Toast;
  10.  
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Locale;
  14.  
  15. public class MainActivity extends AppCompatActivity {
  16.  
  17. private List<Data> list;
  18. private RecyclerView recyclerView;
  19. private BaseRecyclerAdapter<Data> adapter;
  20. private EditText text;
  21.  
  22. @SuppressWarnings("unchecked")
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27.  
  28. list = new ArrayList<>();
  29.  
  30. initList();
  31.  
  32. adapter = new BaseRecyclerAdapter<Data>(this,list,R.layout.list_item) {
  33. @Override
  34. public void convert(BaseRecyclerHolder holder, Data item, int position, boolean isScrolling) {
  35. holder.setText(R.id.item_text,item.getText());
  36. if (item.getImageUrl() != null){
  37. holder.setImageByUrl(R.id.item_image,item.getImageUrl());
  38. }else {
  39. holder.setImageResource(R.id.item_image,item.getImageId());
  40. }
  41. }
  42.  
  43. };
  44.  
  45. adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
  46. @Override
  47. public void onItemClick(RecyclerView parent, final View view, int position) {
  48. Toast.makeText(MainActivity.this, String.format(Locale.CHINA,"你点击了第%d项,长按会删除!",position),Toast.LENGTH_SHORT).show();
  49. }
  50. });
  51.  
  52. adapter.setOnItemLongClickListener(new BaseRecyclerAdapter.OnItemLongClickListener() {
  53. @Override
  54. public boolean onItemLongClick(RecyclerView parent, View view, int position) {
  55. adapter.delete(position);
  56. return true;
  57. }
  58. });
  59.  
  60. text = (EditText) findViewById(R.id.main_text);
  61. recyclerView = (RecyclerView) findViewById(R.id.main_recycler);
  62. recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
  63. recyclerView.setAdapter(adapter);
  64.  
  65. }
  66.  
  67. public void initList(){
  68. for (int i = 0; i < 5; i++) {
  69. list.add(new Data("本地 "+i,R.mipmap.ic_launcher));
  70. }
  71. for (int i = 0; i < 5; i++) {
  72. list.add(new Data("网络 "+i,"http://pic.cnblogs.com/face/845964/20160301162812.png"));
  73. }
  74. }
  75.  
  76. public void btnClick(View view) {
  77. String string = text.getText().toString().trim();
  78. Data data = new Data(string,R.mipmap.ic_launcher);
  79. // list.add(list.size()/2,data);
  80. adapter.insert(data,list.size()/2);
  81.  
  82. Toast.makeText(MainActivity.this,list.size()+"",Toast.LENGTH_SHORT).show();
  83. }
  84. }

RecycleView的万能适配器的更多相关文章

  1. 打造android偷懒神器———ListView的万能适配器

    如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...

  2. 打造android偷懒神器———RecyclerView的万能适配器

    转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时 ...

  3. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  4. Android进阶笔记10:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  5. Android开发之万能适配器

    ListView.GridView等等非常多的东西都需要适配器.而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏.. 什么是ViewHolider以及的用法 ...

  6. Android万能适配器Adapter-android学习之旅(74)

    万能适配器的代码的github地址是https://github.com/fengsehng/CommonAdapter 万能适配器的代码的github地址是https://github.com/fe ...

  7. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  8. Android进阶笔记09:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  9. android listview万能适配器

    参考    Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder { private Con ...

随机推荐

  1. tload

    tload命令以图形化的方式输出当前系统的平均负载到指定的终端.假设不给予终端机编号,则会在执行tload指令的终端机显示负载情形. 语法 tload(选项)(参数) 选项 -s:指定闲时的刻度: - ...

  2. 【opencv】opencv在图片、视频嵌中英文字符的方法

    转自:http://www.cnblogs.com/hujingshuang/p/5119015.html 说明:本博文是根据前人已有的成果并结合自己的理解而成的.为了避免让读者感到繁琐,我将运用小学 ...

  3. putty与emacs

    win环境下putty登录到linux并使用emacs时,需要折腾好配置才能正常工作.下面是折腾过程中碰到的问题与解决步骤: 1)要在putty控制台中启用鼠标,只需要在.emacs配置文件中启用xt ...

  4. Tomcat的一些问题

    首先设置好TOMCAT环境变量(如何设置?) 1.用Servlet发现每次改动Servlet都要重启Tomcat才能生效!!!搞死爹了!! 可以选择shutdown命令或者直接叉掉汤姆猫窗口!!!然后 ...

  5. asp.net core zipkin

    微服务监控zipkin+asp.net core 0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 监控目录:微服务监控zipkin.skywalking以及日志ELK监控系列 一 ...

  6. Ski Course Design

    链接 分析:读题!读题!读题!重要的事说三遍,中文翻译漏掉了一个重要的地方,每个只能用一次,调了一下午还以为标程错了,其实就是找一段长为17的区间,然后使所有都处于这个区间中代价最小,暴力枚举即可. ...

  7. 超实用的JavaScript技巧及最佳实践给

    1.数组创建一个随机项 var items = [12,548,'a',2,5478,'foo',8852,,'Doe',2145,119]; var randomItem = items[Math. ...

  8. k8s-创建自定义chart及部署efk-二十五

    一.chart的结构 (1)更改helm为阿里云仓库源 [root@master helm]# helm repo remove stable "stable" has been ...

  9. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 07. View的Model 和 Tag Helpers

    student添加一个属性BirthDate 然后把生成数据的地方,字段也加上 建立ViewModel list转换为ViewModel 进一步改进代码 StudentViewModel HomeIn ...

  10. python __builtins__ enumerate类 (21)

    21.'enumerate', 用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. class enumerate(object ...