ListView控件在Android应用程序中被使用的频率非常之高,而ListView的主要代码都集中在Adapter中,因为ListView每一行的子View的产生与数据填充都是Adapter中做的,其实就是getView回调函数。getView函数非常重要,技术面试官也喜欢问应聘者对该函数的理解,尤其是View的重用。
getView函数的完整定义如下:
public View getView(int position, View convertView, ViewGroup parent)
其中返回值就是返回给ListView每一行的子View
position为ListView中的第几行
convertView为之前由该函数返回的View,系统再传入进来供我们复用
parent为父容器,一般可以不用到
开发起来其实非常简单,用position来找数据(在数据数组或List中利用position找),convertView为空则利用xml产生一个convertView并返回,不为空则直接返回之,当然返回之前要做的就是把数据填入到convertView中。
其实这样就可以了,填入数据可以用convertView.findViewById函数去找子控件然后设置值。典型代码如下:
public View getView(int position, View convertView, ViewGroup parent) {
if ( convertView == null) {
convertView = inflater.inflate(R.layout.listview_item, null);
}
MyObj myObj = dataList.get(position);
((TextView)convertView.findViewById(R.id.textView1)).setText(myObj.textView1Data);
......
return convertView;
}
代码很简单,但是我们却很少这样写,因为许多人会用到一个内部类,一般取名为ViewHolder,结构一般为:
private class ViewHolder {
public TextView textView1;
......
}
使用的时候一般是这样的:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if ( convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.listview_item, null);
holder.textView1 = (TextView)convertView.findViewById(R.id.textView1);
......
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
MyObj myObj = dataList.get(position);
holder.textView1.setText(myObj.textView1Data);
......
return convertView;
}
本来可以写得很简单,加入ViewHolder后好像变复杂了,而且许多人认为ViewHolder是必配的,其实通过前面更原始的写法就可以判断ViewHolder不是必须的,用的理由就是一个:提高效率。
因为ViewHolder对象里持有当前convertView中每一个子View的引用,找子View用ViewHolder对象直接访问比用findViewById来的更快。所以ViewHolder内部类唯一的作用就是缓存子View,让程序找起来更快而已。
通过前面的分析,既然ViewHolder不是必须的,只用来缓存,而且我们程序中有许多的Adapter,如果每个Adapter都定义一个内部类ViewHolder,显然会有很多重复代码。那么提炼一个公共方法专门缓存子View就很容易被想到了。下面是别人提炼出来的公共方法:
public class ViewHolder {
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
}
具体使用如下:
public View getView(int position, View convertView, ViewGroup parent) {
if ( convertView == null) {
convertView = inflater.inflate(R.layout.listview_item, null);
}
MyObj myObj = dataList.get(position);
TextView textView1 = ViewHolder.get(convertView,R.id.textView1)
textView1.setText(myObj.textView1Data);
......
return convertView;
}
程序一样很简单,同时效率不受影响,重复代码也少。
分享到:
相关推荐
ListView中getView重用好多次,有头像的布局
listview通过adapter的getview函数获得每行的item。滑动过程中, a、如果某行item已经划出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存; b、获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,...
为便于学习自定义的Adapter,本案例的界面未进行美化,功能已经实现,对于其中的getView(int position,View view ,ViewGroup vg)做了数据的填充操作。本案例功能及其简单,只涉及ListView中自定义适配器,没有对...
android listview getview多调用俩周期
android gridview adapter 实例 每个getview显示不同的数据
今天在写一个GridView的BaseAdapter时发现,Adapter的getview方法在position为0的时候会连续调用好几次。 我们知道谷歌时是做过优化的,让view有个缓存,我怀疑是因为做缓存的原因才让position连续调用 log如图 可见...
Adapter的getView()方法就是用来创建这些视图的,Adapter并不会为每行数据都创建一个新视图,而是提供了回收旧视图的方法。运行机制简单说就是当getView()方法被调用是,如果convertView参数不为null,就使用co
异步创建View这种操作一般情况下是用不...以往的我们使用一个Listview一般都是为了展示一类布局相同的信息,这种情况下,我们可以通过adapter的getView()方法中的convertView来实现View的复用,使View不用反复创建。
ListView的adapter的getView方法中,我们使用ViewHolder来保证getView的执行效率,例子是一个通用的ViewHolder的实现。
3.重写Adapter的getView方法时,为每个checkbox添加事件响应并记录选择状态,通过获取获取状态记录值获取所有选择的checkbox值。 需要注意的是第三点,在重写getView方法时,不要判断convertView == null,如果判断...
主要是测试baseAdapter的getView在生成实例时的空判断进行接卸
对于android中的ListView刷新机制,大多数的程序员都是很熟悉的,修改或者添加adapter中的数据源之后,然后调用notifyDataSetChanged()刷新ListView。在这种模式下,我们会在getView中,根据不同的数据源,让控件...
Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源? ...
当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图。触摸滚动时,频繁调用。支持成百上千条数据。 下面为显示每条数据的xml文件: android:orientation> <ImageView android
1.在adapter 的 getview方法里面启动加载图片的thread,如果listview在滑动则wait 2.监听listview滑动停止事件,获得listview显示的item的最上面和最下面的序号,并唤醒所有加载图片的thread,判断加载图片的序号...
如果adapter中有多个类型的Item,我们还得在getView()中写很多if-else语句,很乱。 而现在我让adapter的代码量减少到一个8行的内部类,如果你需要更换item只需要动一行代码,真正实现了可插拔化。最关键的是item现在...
Adapter的一种写法 package com.xxkjx.jiusanqi; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; ...
android自定义接口,然后在activity中实现点击监听,调用getView解决滑动错位的问题,
以前倒是没有注意listview的getView会重复执行多次,在测试的时候去断点跟踪,发现同一条数据不断的重复执行,下面与大家分享下正确的解决方法,希望对你有所帮助
写在前面的话: 看到标题这么长可能大家有点抓狂了,是的,我在刚刚学这一篇的时候有一些不理解,什么是布局泵?...然后最后将我们自定义的Adapter放入到了我们的ListView中以实现展示了这种效果下面