Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。
优化的思路两种:
1. View的重用
View的每次创建是比较耗时的,因此对于getview方法传入的convertView应充分利用 != null的判断
2.ViewHolder的应用
View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。
下面是优化后的代码供参考:
public class MyAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mInflater;
public MyAdapter(Context context) {
this.mContext = context;
mInflater = LayoutInflater.from(mContext);
}
public int getCount() {
return mmsList.size();
}
public Object getItem(int arg0) {
return arg0;
}
public long getItemId(int arg0) {
return arg0;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.mmslistitem, null);
holder.img = (ImageView) convertView.findViewById(R.id.mmsflag);
holder.subject = (TextView) convertView
.findViewById(R.id.mmssubject);
holder.date = (TextView) convertView.findViewById(R.id.mmsdate);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
MMSDBItem mmsItem = mmsList.get(position);
holder.subject.setText(mmsItem.getSubject());
String today = DateFormat.format("yyyy-MM-dd",
System.currentTimeMillis()).toString();
String dateStr = DateFormat.format("yyyy-MM-dd kk:mm",
mmsItem.getDate()).toString();
holder.date.setText(dateStr);
if (mmsItem.getFlag() == 0) {
holder.img.setBackgroundResource(R.drawable.new_message_32);
} else {
holder.img
.setBackgroundResource(R.drawable.message_already_read_32);
}
return convertView;
}
public final class ViewHolder {
public ImageView img;
public TextView subject;
public TextView date;
}
}
分享到:
相关推荐
超简洁ViewHolder,直接加入工具类就可以了
Android ViewHolder示例 该项目的例子 将ViewHolder模式用于ListView 。 参见 对GridView使用ViewHolder模式。 请参阅 实施RecyclerView.ViewHolder为RecyclerView 。 请参阅 参考-> ...>将
viewHolder封装的工具类,及其使用
万能的ViewHolder
android ViewHolder的超简洁写法,不用为每个adapter都创建一个ViewHolder类
ViewHolder超级简洁写法 博客地址:http://blog.csdn.net/kroclin/article/details/40868291
跟传统的ListView的布局应用,改善了Adapter,使用ViewHolder来提高了很多效率,使用ViewHolder来编写的适配器
ViewHolder和Adapter 工具类
listview优化 BaseAdapter
通常我们在一个项目中会多处使用到listview,我们为什么不把它抽取出来呢,这样使用起来方便一百倍,而且可以提高代码的复用率
通用Adapter 通用ViewHolder
我们在使用ListView的时候,经常会使用的ViewHolder方式作为缓存,每次都需要手动的通过viewholder.icon = convertview.findVIewByid(id);一般的app都会有好几个页面会用到ListView,这样的话我们的代码量就会很大,...
这里介绍了listView的基本使用,数据源的添加,以及viewHolder机制的添加以及介绍
ListViewAdapter和ViewHolder代码,全面的安卓listview适配器源码。使得使用listview绑定数据显示非常方面
Recyclerview由于ViewHolder的复用显示错乱问题解决
把SparseArray绑定到一个view,SparseArray 初始化会分配10长度的地址,理论上会浪费了内存,但是这些都在允许范围内。省去了重复写viewholder的重复,重复。。自己留作纪念。
万能的Adapter和ViewHolder,写这些真的是写吐了,提高效率
对ListView的适配器BaseAdapter进行优化,减少代码量,可以继续对此工具类添加方法
ListView的adapter的getView方法中,我们使用ViewHolder来保证getView的执行效率,例子是一个通用的ViewHolder的实现。
通用ViewHolder