对于 ListView 的使用,他有两个重点的部分,一个是下拉刷新和加载更多,这个今天我们不讲,另外一个是 BaseAdapter 的使用,这个是今天的主角,BaseAdapter 中又有 ViewHolder 模式来实现缓存视图
继承BaseAdapter类,实现以下几个方法
getCount() ->int 返回的是 List的个数
getView(int, View, ViewGroup)->View 返回显示的视图
getItemId(int position) ->long返回position位置的 id
getItem(int position)->Object 返回position位置的 item
现在我们在这个基础上,继承 BaseAdapter 实现几个方法.
MBaseAdapter.class
public abstract class MBaseAdapter extends BaseAdapter {
public LayoutInflater inflater;
public Context context;
public List<?> list;
public MBaseAdapter(Context context, List<?> list) {
this.context = context;
this.list = list;
this.inflater = LayoutInflater.from(context);
}
public MBaseAdapter(LayoutInflater inflater, List<?> list) {
this.context = inflater.getContext();
this.list = list;
this.inflater = inflater;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getView33(position, convertView, parent);
}
/**
* 与BaseAdapter 中的getView() 一样
*
* @param position
* @param convertView
* @param parent
* @return
*/
public abstract View getView33(int position, View convertView,
ViewGroup parent);
}
为了实现 ViewHodler 缓存我写了这个工具类
ViewHolderUtils.class
public class ViewHolderUtils {
/**
* 得到视图为 view 的 viewHodler
* @param view
* @return
*/
public ViewHolder get(View view) {
ViewHolder viewHolder = (ViewHolder) view.getTag();
if (viewHolder == null) {
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
}
return viewHolder;
}
/**
* viewhodler 存储 view的子 view 的索引
* @author zzz40500
*
*/
public class ViewHolder {
private SparseArray<View> viewHolder;
private View view;
public ViewHolder(View view) {
this.view = view;
viewHolder = new SparseArray<View>();
}
public <T extends View> T get(int id) {
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
/**
* 得到 view 下 id 为 id 的TextView 这里没有做类型的判断所以你要保证 id 为 id 的控件确实为 TextView类型
* @param id
* @return
*/
public TextView getTextView(int id) {
return get(id);
}
/**
* 直接设置文字
* @param id
* @param text
*/
public void setText(int id,String text){
getTextView(id).setText(text);
}
public ImageView getImageView(int id) {
return get(id);
}
}
}
现在结合上面两个类,我们可是实现了更简单的 adapter 写法
AutoAdapter.class
public abstract class AutoAdapter extends MBaseAdapter{
/**
* item 的布局文件
*/
private int layoutID;
/**
* 这是一个生产 ViewHolder的工具类
*/
private ViewHolderUtils vh;
public AutoAdapter(Context context, List<?> list, int layoutID) {
super(context, list);
this.layoutID = layoutID;
vh = new ViewHolderUtils();
}
@Override
public View getView33(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(layoutID, parent, false);
}
getView33(position, convertView, vh.get(convertView));
return convertView;
}
/**
* 通过暴露这个方法,通过操作vh实现将数据的绑定在视图上
* @param position
* @param v
* @param vh
*/
public abstract void getView33(int position, View v, ViewHolderUtils.ViewHolder vh);
}
重点来了:
我们现在有一个适配器要写,怎么写呢,只要继承AutoAdapter,
我们只要实现了两个方法:getView33和它自身的构造方法,他就可以快速实现了适配器的编写,并且这个适配器是 Viewhodler 的形式.
例子:
public class DemoAdapter extends AutoAdapter {
public DemoAdapter(Context context, List<?> list) {
/**
* 这里的 LayoutID 确定 ListView item 的布局资源文件.
*/
super(context, list, R.layout.item);
}
/**
* 将数据绑定在视图上
*/
@Override
public void getView33(int position, View v, ViewHolder vh) {
Entity item=(Entity) list.get(position);
vh.getTextView(R.id.name).setText(item.getName());
vh.getTextView(R.id.age).setText(item.getAge());
vh.setText(R.id.height,item.getHeight());
}
}
在 Activity 中的使用:
BaseAdapter adapter=new DemoAdapter(this, dateA);
listView.setAdapter(adapter);
- listView中adapter有不同的click事件的简单写法
在android中,listview一般都是通过一个adapter来绑定数据,一般的item的点击事件都会指向同一个目标(intent),仅仅是所带的參数不同而已.但有的时候事与愿违,每一个item的 ...
- Android 关于ListView中adapter调用notifyDataSetChanged无效的原因
话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但 ...
- Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因
1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有 ...
- android代码优化----ListView中自定义adapter的封装(ListView的模板写法)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- [Android]ListView的Adapter.getView()方法中延迟加载图片的优化
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...
- android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法
adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...
- listview中的adapter学习小结
概述 Adapter是数据和UI之间的一个桥梁,在listview,gridview等控件中都会使用到,android给我们提拱了4个adapte供我们使用: BaseAdapter是一个抽象类,继承 ...
- ListView的adapter中getView方法一直调用
当ListView的高度不定(比如重写ListView搞成可自己主动的扩展的ListView)或 ListView嵌套在SrollView(高度不定)中,listView中的一个item元素改变会使得 ...
- ListView中动态显示和隐藏Header&Footer
ListView的模板写法 ListView模板写法的完整代码: android代码优化----ListView中自定义adapter的封装(ListView的模板写法) 以后每写一个ListView ...
随机推荐
- Oj 24260: Lilypad Pond (神奇广搜题,状态搜索)
题目 为了让奶牛们娱乐和锻炼,约翰建造了一个美丽的池塘.这个池塘是矩形的,可以分成M×N个方格.一些格子是坚固得令人惊讶的莲花,还有一些是岩石,其余的只是美丽,纯净,湛蓝的水.贝西正在练习芭蕾舞,她站 ...
- ZOJ - 2401 水DP
最近会多做点巩固基础的题目 #include<iostream> #include<algorithm> #include<cstdio> #include< ...
- ZOJ - 3624
当A连向C,B连向D时存在相交路径 #include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<=k;i++) #define ...
- SQL中的object_id函数
关于SQL中的object_id函数:应该就是指系统表中存储着数据库的所有对象 每一个对象都有一个唯一的标识符Id进行标识object_id 就是根据对象名称返回改对象的Idobject_name 就 ...
- 单个html使用axios调用接口传参
单个html页面使用axios调用接口传参(没有使用v-cli搭建框架,也没有使用qs等等) 1.使用 URLSearchParams的方法 var params = new URLSearchPar ...
- js面向切面编程
Function.prototype.before=function(func){ var _self=this; return function(){ if(func.apply(this,arg ...
- git 填坑之 git 暂存区忽略文件
今天修改公司项目文件的时候,发现被修改的文件的始终不显示已经被修改. 本来是想要把 KWh 改成 kWh,然后执行 git status 后,没有文件修改记录: 开始分析究竟是因为什么导致的这样诡异的 ...
- 转 C#对多个集合和数组的操作(合并,去重,判断)
在开发过程中.数组和集合的处理是最让我们担心.一般会用for or foreach 来处理一些操作.这里介绍一些常用的集合跟数组的操作函数. 首先举例2个集合A,B. List<int> ...
- vue组件中camelCased (驼峰式) 命名与 kebab-case(短横线命名)
HTML 特性是不区分大小写的.所以,当使用的不是字符串模版,camelCased (驼峰式) 命名的 prop 需要转换为相对应的 kebab-case (短横线隔开式) 命名: 如果你使用字符串模 ...
- 设计模式学习总结(十)责任链模式(Chain Of Responsibility)
责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发! 一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...