RecycleView的万能适配器
转载自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变成一个抽象方法,这样在子类中就可以去通过强制实现的方式把我们的数据填充进去。
还是直接看源码吧。
- package com.example.nanchen.commonadaperrecyclerdemo;
- import android.content.Context;
- import android.support.v7.widget.RecyclerView;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import java.util.List;
- /**
- * 万能的RecyclerView适配器
- * Created by 南尘 on 16-7-30.
- */
- public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerHolder> {
- private Context context;//上下文
- private List<T> list;//数据源
- private LayoutInflater inflater;//布局器
- private int itemLayoutId;//布局id
- private boolean isScrolling;//是否在滚动
- private OnItemClickListener listener;//点击事件监听器
- private OnItemLongClickListener longClickListener;//长按监听器
- private RecyclerView recyclerView;
- //在RecyclerView提供数据的时候调用
- @Override
- public void onAttachedToRecyclerView(RecyclerView recyclerView) {
- super.onAttachedToRecyclerView(recyclerView);
- this.recyclerView = recyclerView;
- }
- @Override
- public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
- super.onDetachedFromRecyclerView(recyclerView);
- this.recyclerView = null;
- }
- /**
- * 定义一个点击事件接口回调
- */
- public interface OnItemClickListener {
- void onItemClick(RecyclerView parent, View view, int position);
- }
- public interface OnItemLongClickListener {
- boolean onItemLongClick(RecyclerView parent, View view, int position);
- }
- /**
- * 插入一项
- *
- * @param item
- * @param position
- */
- public void insert(T item, int position) {
- list.add(position, item);
- notifyItemInserted(position);
- }
- /**
- * 删除一项
- *
- * @param position 删除位置
- */
- public void delete(int position) {
- list.remove(position);
- notifyItemRemoved(position);
- }
- public BaseRecyclerAdapter(Context context, List<T> list, int itemLayoutId) {
- this.context = context;
- this.list = list;
- this.itemLayoutId = itemLayoutId;
- inflater = LayoutInflater.from(context);
- // recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
- // @Override
- // public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- // super.onScrollStateChanged(recyclerView, newState);
- // isScrolling = !(newState == RecyclerView.SCROLL_STATE_IDLE);
- // if (!isScrolling) {
- // notifyDataSetChanged();
- // }
- // }
- // });
- }
- @Override
- public BaseRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view = inflater.inflate(itemLayoutId, parent, false);
- return BaseRecyclerHolder.getRecyclerHolder(context, view);
- }
- @Override
- public void onBindViewHolder(final BaseRecyclerHolder holder, int position) {
- if (listener != null){
- holder.itemView.setBackgroundResource(R.drawable.recycler_bg);//设置背景
- }
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (listener != null && view != null && recyclerView != null) {
- int position = recyclerView.getChildAdapterPosition(view);
- listener.onItemClick(recyclerView, view, position);
- }
- }
- });
- holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View view) {
- if (longClickListener != null && view != null && recyclerView != null) {
- int position = recyclerView.getChildAdapterPosition(view);
- longClickListener.onItemLongClick(recyclerView, view, position);
- return true;
- }
- return false;
- }
- });
- convert(holder, list.get(position), position, isScrolling);
- }
- @Override
- public int getItemCount() {
- return list == null ? 0 : list.size();
- }
- public void setOnItemClickListener(OnItemClickListener listener) {
- this.listener = listener;
- }
- public void setOnItemLongClickListener(OnItemLongClickListener longClickListener) {
- this.longClickListener = longClickListener;
- }
- /**
- * 填充RecyclerView适配器的方法,子类需要重写
- *
- * @param holder ViewHolder
- * @param item 子项
- * @param position 位置
- * @param isScrolling 是否在滑动
- */
- public abstract void convert(BaseRecyclerHolder holder, T item, int position, boolean isScrolling);
- }
其他的代码就很简单了,java bean类Data和布局和昨天一样的,大家可以自己去随便怎么布局。
这里只上一个MainActivity的代码
- package com.example.nanchen.commonadaperrecyclerdemo;
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import android.support.v7.widget.LinearLayoutManager;
- import android.support.v7.widget.RecyclerView;
- import android.view.View;
- import android.widget.EditText;
- import android.widget.Toast;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Locale;
- public class MainActivity extends AppCompatActivity {
- private List<Data> list;
- private RecyclerView recyclerView;
- private BaseRecyclerAdapter<Data> adapter;
- private EditText text;
- @SuppressWarnings("unchecked")
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- list = new ArrayList<>();
- initList();
- adapter = new BaseRecyclerAdapter<Data>(this,list,R.layout.list_item) {
- @Override
- public void convert(BaseRecyclerHolder holder, Data item, int position, boolean isScrolling) {
- holder.setText(R.id.item_text,item.getText());
- if (item.getImageUrl() != null){
- holder.setImageByUrl(R.id.item_image,item.getImageUrl());
- }else {
- holder.setImageResource(R.id.item_image,item.getImageId());
- }
- }
- };
- adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
- @Override
- public void onItemClick(RecyclerView parent, final View view, int position) {
- Toast.makeText(MainActivity.this, String.format(Locale.CHINA,"你点击了第%d项,长按会删除!",position),Toast.LENGTH_SHORT).show();
- }
- });
- adapter.setOnItemLongClickListener(new BaseRecyclerAdapter.OnItemLongClickListener() {
- @Override
- public boolean onItemLongClick(RecyclerView parent, View view, int position) {
- adapter.delete(position);
- return true;
- }
- });
- text = (EditText) findViewById(R.id.main_text);
- recyclerView = (RecyclerView) findViewById(R.id.main_recycler);
- recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
- recyclerView.setAdapter(adapter);
- }
- public void initList(){
- for (int i = 0; i < 5; i++) {
- list.add(new Data("本地 "+i,R.mipmap.ic_launcher));
- }
- for (int i = 0; i < 5; i++) {
- list.add(new Data("网络 "+i,"http://pic.cnblogs.com/face/845964/20160301162812.png"));
- }
- }
- public void btnClick(View view) {
- String string = text.getText().toString().trim();
- Data data = new Data(string,R.mipmap.ic_launcher);
- // list.add(list.size()/2,data);
- adapter.insert(data,list.size()/2);
- Toast.makeText(MainActivity.this,list.size()+"",Toast.LENGTH_SHORT).show();
- }
- }
RecycleView的万能适配器的更多相关文章
- 打造android偷懒神器———ListView的万能适配器
如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...
- 打造android偷懒神器———RecyclerView的万能适配器
转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时 ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
- Android进阶笔记10:Android 万能适配器
1. Android 万能适配器 项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...
- Android开发之万能适配器
ListView.GridView等等非常多的东西都需要适配器.而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏.. 什么是ViewHolider以及的用法 ...
- Android万能适配器Adapter-android学习之旅(74)
万能适配器的代码的github地址是https://github.com/fengsehng/CommonAdapter 万能适配器的代码的github地址是https://github.com/fe ...
- 安卓开发笔记——打造万能适配器(Adapter)
为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...
- Android进阶笔记09:Android 万能适配器
1. Android 万能适配器 项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...
- android listview万能适配器
参考 Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder { private Con ...
随机推荐
- tload
tload命令以图形化的方式输出当前系统的平均负载到指定的终端.假设不给予终端机编号,则会在执行tload指令的终端机显示负载情形. 语法 tload(选项)(参数) 选项 -s:指定闲时的刻度: - ...
- 【opencv】opencv在图片、视频嵌中英文字符的方法
转自:http://www.cnblogs.com/hujingshuang/p/5119015.html 说明:本博文是根据前人已有的成果并结合自己的理解而成的.为了避免让读者感到繁琐,我将运用小学 ...
- putty与emacs
win环境下putty登录到linux并使用emacs时,需要折腾好配置才能正常工作.下面是折腾过程中碰到的问题与解决步骤: 1)要在putty控制台中启用鼠标,只需要在.emacs配置文件中启用xt ...
- Tomcat的一些问题
首先设置好TOMCAT环境变量(如何设置?) 1.用Servlet发现每次改动Servlet都要重启Tomcat才能生效!!!搞死爹了!! 可以选择shutdown命令或者直接叉掉汤姆猫窗口!!!然后 ...
- asp.net core zipkin
微服务监控zipkin+asp.net core 0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 监控目录:微服务监控zipkin.skywalking以及日志ELK监控系列 一 ...
- Ski Course Design
链接 分析:读题!读题!读题!重要的事说三遍,中文翻译漏掉了一个重要的地方,每个只能用一次,调了一下午还以为标程错了,其实就是找一段长为17的区间,然后使所有都处于这个区间中代价最小,暴力枚举即可. ...
- 超实用的JavaScript技巧及最佳实践给
1.数组创建一个随机项 var items = [12,548,'a',2,5478,'foo',8852,,'Doe',2145,119]; var randomItem = items[Math. ...
- k8s-创建自定义chart及部署efk-二十五
一.chart的结构 (1)更改helm为阿里云仓库源 [root@master helm]# helm repo remove stable "stable" has been ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 07. View的Model 和 Tag Helpers
student添加一个属性BirthDate 然后把生成数据的地方,字段也加上 建立ViewModel list转换为ViewModel 进一步改进代码 StudentViewModel HomeIn ...
- python __builtins__ enumerate类 (21)
21.'enumerate', 用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. class enumerate(object ...