通用Adapter设计,SparseArray+泛型+回调的使用
看到题目,我相信聪明的各位已经有一定想法了。
一个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+泛型+回调的使用的更多相关文章
- 为RecyclerView打造通用Adapter
##RecycleView简单介绍 RecyclerView控件和ListView的原理有非常多相似的地方,都是维护少量的View来进行显示大量的数据.只是RecyclerView控件比ListVie ...
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
原文出处: 张鸿洋 (Granker,@鸿洋_ ) 一.概述 记得好久以前针对ListView类控件写过一篇打造万能的ListView GridView 适配器,如今RecyclerView异军突起, ...
- Android中适用于ListView、GridView等组件的通用Adapter
今天随便逛逛CSDN,看到主页上推荐了一篇文章Android 高速开发系列 打造万能的ListView GridView 适配器,刚好这两天写项目自己也封装了相似的CommonAdapter,曾经也在 ...
- Cocos Creator 通用框架设计 —— 资源管理优化
接着<Cocos Creator 通用框架设计 -- 资源管理>聊聊资源管理框架后续的一些优化: 通过论坛和github的issue,收到了很多优化或bug的反馈,基本上抽空全部处理了,大 ...
- 多租户通用权限设计(基于casbin)
多租户通用权限设计(基于 casbin) 所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断. 权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中 ...
- Android通用框架设计与完整电商APP开发系列文章
作者|傅猿猿 责编|Javen205 有福利 有福利 有福利 鸣谢 感谢@傅猿猿 邀请写此系列文章 Android通用框架设计与完整电商APP开发 课程介绍 [导学视频] [课程详细介绍] 以下是部分 ...
- Android简单开发之 通用Adapter ViewHolder
我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...
- Cocos Creator 通用框架设计 —— 网络
在Creator中发起一个http请求是比较简单的,但很多游戏希望能够和服务器之间保持长连接,以便服务端能够主动向客户端推送消息,而非总是由客户端发起请求,对于实时性要求较高的游戏更是如此.这里我们会 ...
- ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)
主要更新: 1:升级处理机制(js请求由同步变更为异步) 2:优化前端JS:包括API和配置方式. 3:增加InputDialog功能. 4:增远远程验证功能. 5:优化权限安全机制. 6:增加一次请 ...
随机推荐
- QT:用QWebSocket实现webchannel,实现C++与HTML通信
基本原理是通过channel将C++对象暴露给HTML,在HTML中调用qwebchannel.js.前提是建立transport,QT只提供了一个抽象基类QWebChannelAbstractTra ...
- mysql 外键的几种约束
restrict方式 同no action, 都是立即检查外键约束 --限制,指的是如果字表引用父表的某个字段的值,那么不允许直接删除父表的该值: cascade方式 在父表上update/de ...
- 做直线不要使用hr
需要横线.竖线时不要使用hr标签来做,容易出问题,可以使用高度或宽度为1px并加上背景色的div.p代替.
- python核心编程一书笔记之第一篇
#!/usr/bin/env python# -*- coding:utf-8 -*- #env 是一个命令用来寻找系统中的python解释器.第二条解释使用utf-8编码 在类unix系统中允许py ...
- Linux上安装二进制文件MySQL详解
前言:昨天晚上搞了很久,终于搞清楚mysql的安装配置了,我真是太low了.当我在云服务器上登进Mysql时,真是高兴哈哈,咱一步一步来,彻底搞懂Mysql的安装配置. 我的安装环境: 阿里云服务器 ...
- BZOJ-2463
2463: [中山市选2009]谁能赢呢? Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2321 Solved: 1711[Submit][Sta ...
- rsync远程数据同步工具的使用
准备工作 虚拟机1: 192.168.24.41, 用于搭建rsync服务器 虚拟机2: 192.168.26.68, 用于搭建rsync客户端 虚拟机1和虚拟机2均为centos7; 1. 检查虚拟 ...
- 行内脚本的位置放置----css阻塞行内脚本
行内脚本:避免放置在css和其他资源之间. 若在head中,最好放在css样式表之前,如果放置在样式表之后,会引起css阻塞. css阻塞:由于浏览器要保证css和JavaScript的执行顺序,cs ...
- sass学习--在htm文件中使用
一.导语 最近的战狼2好火爆啊,每天看战狼2的票房一路高飙,我估计比吴京还开心.看了这部戏的拍摄过程,除了敬佩就是踏实,是的,吴京是电影圈隔了这么久后能踏踏实实做电影的了,纯属个人见解,不喜请忽略.. ...
- (转)微信开发连接SAE数据库
原文地址:http://blog.csdn.net/tterminator/article/details/51067130 在读写云数据库MySQL之前,需要说明的是,在新浪云平台上使用数据库时,该 ...