看到题目,我相信聪明的各位已经有一定想法了。
一个Adapter,最简单的优化就是使用泛型,他可以省去非常多的代码,不过在此之上,我们还可以继续优化,优化他的好基友是:ViewHolder。
在过去,我们通常使用一个内部类来写ViewHolder,换一种思路,我们用集合来设计ViewHolder,集合的泛型指定为View,这样ViewHolder就变成通用的了。
原理知道了,后面只剩下代码逻辑问题了。
(注:特别复杂的Listview或者RecycleView不适用,用集合替换ViewHolder,因为算法难度增加了,页面加载效率相对降低了,可能会出现页面抖动的情况)

源码:

使用情况:

public class ListRecycle extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> mDatas; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_recycle);
recyclerView = (RecyclerView) findViewById(R.id.list_recycle_rv); initData();
LinearLayoutManager layoutManager = new LinearLayoutManager(ListRecycle.this);
recyclerView.setLayoutManager(layoutManager);
layoutManager.setOrientation(OrientationHelper.VERTICAL); //使用情况就跟写按钮点击事件一样
//指定泛型:String
//参数:上下文,
// Item的布局Id,
// List(泛型和Adapter相同:String)
recyclerView.setAdapter(new MyRecycleAdapter<String>(ListRecycle.this,
R.layout.activity_list_recycle_item, mDatas) {
@Override
void bindView(MyViewHolder holder, String obj) {
holder.setText(R.id.list_recycle_item_txt, obj);
}
});
recyclerView.setItemAnimator(new DefaultItemAnimator()); } private void initData() {
mDatas = new ArrayList<String>();
for (int i = 0; i < 40; i++) {
mDatas.add("item" + i);
}
}
}

实现类(以RecycleView的Adapter为例):

**
* Created by ChenSS on 2016/9/21.
*/
public abstract class MyRecycleAdapter<T> extends RecyclerView.Adapter<MyRecycleAdapter.MyViewHolder> {
//个人喜欢List
private List<T> mData;
private LayoutInflater mLayoutInflater;
//Item的布局Id
private int mLayoutRes; public MyRecycleAdapter(Context context, int mLayoutRes, List<T> mData) {
this.mData = mData;
this.mLayoutRes = mLayoutRes;
mLayoutInflater = LayoutInflater.from(context);
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(mLayoutRes, null, false);
return new MyViewHolder(view);
} @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//调用我们自己的回调方法
this.bindView(holder, mData.get(position));
} //这个就是要回调的方法,其实也可以考虑回调onBindViewHolder的,但是自己写更灵活一些,参数可以自己指定,还可以考虑加别的
abstract void bindView(MyRecycleAdapter.MyViewHolder holder, T obj); @Override
public int getItemCount() {
return mData != null ? mData.size() : 0;
} public static class MyViewHolder extends RecyclerView.ViewHolder {
//另一个关键点,集合,这个集合跟Map类似,效率比Map高
private SparseArray<View> mViews;
//RecycleView的一个item
private View item;
private static MyViewHolder sHolder = null; public MyViewHolder(View itemView) {
super(itemView);
item = itemView;
mViews = new SparseArray<>();
} /**
* 最后一个关键点,封装findViewById,使用我们自己的
*
* @param id
* @param <T>
* @return
*/
@SuppressWarnings("unchecked")
public <T extends View> T findView(int id) {
T t = (T) mViews.get(id);
if (t == null) {
t = (T) item.findViewById(id);
mViews.put(id, t);
}
return t;
} /**
* 直接返回当前item,比如说:给Item添加点击事件,就不要用其它接口回调什么的了,已经用了其它回调,再用就太乱了
*/
public View getItemView() {
return item;
} /**
* 设置文字
*/
public MyViewHolder setText(int id, CharSequence text) {
View view = findView(id);
if (view instanceof TextView) {
((TextView) view).setText(text);
}
return this;
} /**
* 设置点击监听
*/
public MyViewHolder setOnClickListener(int id, View.OnClickListener listener) {
findView(id).setOnClickListener(listener);
return this;
}
}
}

通用Adapter设计,SparseArray+泛型+回调的使用的更多相关文章

  1. 为RecyclerView打造通用Adapter

    ##RecycleView简单介绍 RecyclerView控件和ListView的原理有非常多相似的地方,都是维护少量的View来进行显示大量的数据.只是RecyclerView控件比ListVie ...

  2. 为RecyclerView打造通用Adapter 让RecyclerView更加好用

    原文出处: 张鸿洋 (Granker,@鸿洋_ ) 一.概述 记得好久以前针对ListView类控件写过一篇打造万能的ListView GridView 适配器,如今RecyclerView异军突起, ...

  3. Android中适用于ListView、GridView等组件的通用Adapter

    今天随便逛逛CSDN,看到主页上推荐了一篇文章Android 高速开发系列 打造万能的ListView GridView 适配器,刚好这两天写项目自己也封装了相似的CommonAdapter,曾经也在 ...

  4. Cocos Creator 通用框架设计 —— 资源管理优化

    接着<Cocos Creator 通用框架设计 -- 资源管理>聊聊资源管理框架后续的一些优化: 通过论坛和github的issue,收到了很多优化或bug的反馈,基本上抽空全部处理了,大 ...

  5. 多租户通用权限设计(基于casbin)

    多租户通用权限设计(基于 casbin) 所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断. 权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中 ...

  6. Android通用框架设计与完整电商APP开发系列文章

    作者|傅猿猿 责编|Javen205 有福利 有福利 有福利 鸣谢 感谢@傅猿猿 邀请写此系列文章 Android通用框架设计与完整电商APP开发 课程介绍 [导学视频] [课程详细介绍] 以下是部分 ...

  7. Android简单开发之 通用Adapter ViewHolder

    我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...

  8. Cocos Creator 通用框架设计 —— 网络

    在Creator中发起一个http请求是比较简单的,但很多游戏希望能够和服务器之间保持长连接,以便服务端能够主动向客户端推送消息,而非总是由客户端发起请求,对于实时性要求较高的游戏更是如此.这里我们会 ...

  9. ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)

    主要更新: 1:升级处理机制(js请求由同步变更为异步) 2:优化前端JS:包括API和配置方式. 3:增加InputDialog功能. 4:增远远程验证功能. 5:优化权限安全机制. 6:增加一次请 ...

随机推荐

  1. ASP.NET Core 认证与授权[3]:OAuth & OpenID Connect认证

    在上一章中,我们了解到,Cookie认证是一种本地认证方式,通常认证与授权都在同一个服务中,也可以使用Cookie共享的方式分开部署,但局限性较大,而如今随着微服务的流行,更加偏向于将以前的单体应用拆 ...

  2. Sql语句备份Sqlserver数据库

    BACKUP DATABASE [POS_YiZhuang]TODISK = N'C:\数据库\POS_YiZhuang2016-09-20-3.bak'WITHNAME = N'POS_YiZhua ...

  3. spring-boot学习资料

    spring-boot: http://www.ityouknow.com/spring-boot 这里的内容都可以学习下: https://zhuanlan.zhihu.com/dreawer?to ...

  4. Windows搭建wnmp

    1. 下载安装nginx: nginx官网下载地址:http://nginx.org/en/download.html 下载任一版本(我下载的是stable1.12.1版本)解压到D:\wnmp\ng ...

  5. 浅析Entity Framework Core中的并发处理

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式. 1.常见的并发处 ...

  6. Python之qq邮件

    用python发送电子邮件验证这个功能,可以说花费了我很久时间,这也是为什么我重头敲了之前的两遍代码.不要说我傻,仅仅是笨了一点而已 ^.- . 之前我所参考是如何发送 GMail. 但是我并不想这么 ...

  7. Java基础笔记9

    super关键字 表示父类对象. 1.可以调用父类中被重写的方法. 2.还有调用父类中的构造方法.放在子类构造方法的第一行. 不能和this关键字同时出现. final关键字 1.修饰属性.表示常量. ...

  8. 微信小程序用setData修改数组或对象中的一个属性值

    在page中有如下数组 data: { info:[ { name:"yuki", tou:"../img/head.jpg", zGong:130, gMon ...

  9. (转)Spark JAVA RDD API

    对API的解释: 1.1 transform l  map(func):对调用map的RDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集 l   ...

  10. 0_Simple__asyncAPI

    关于CPU - GPU交互的简单接口函数. ▶ 源代码: // includes, system #include <stdio.h> // includes CUDA Runtime # ...