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;
}
}
分享到:
相关推荐
"ListView使用ViewHolder模式提高效率"这一主题就是解决这个问题的关键知识点。 ViewHolder模式是Android开发中为了提升ListView性能而设计的一种优化策略。它通过减少findViewById的调用来改善视图的绘制速度。在...
// 使用viewHolder填充数据 viewHolder.textView.setText(items.get(position)); viewHolder.imageView.setImageResource(imageIds[position]); // 设置其他视图的数据... return convertView; } ``` 3. **...
这里的关键步骤是使用convertView.getTag()获取ViewHolder实例,如果convertView为空,就创建一个新的ViewHolder并与convertView关联。这样,当ListView项被重用时,我们可以通过ViewHolder快速访问到对应的View,而...
在上述代码中,我们使用SparseArray来存储ViewHolder对象,当需要创建新的ViewHolder时,我们先检查SparseArray中是否存在对应位置的对象,如果存在则直接复用,否则才创建新的ViewHolder并添加到SparseArray中。...
超简洁ViewHolder,直接加入工具类就可以了
// 在Adapter中使用 @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return ViewHolderUtils.create(parent, R.layout.item_layout); } @Override public void ...
- 在getView()方法中,首先检查convertView是否为空,如果不为空则直接使用,否则创建新的convertView,并将ViewHolder对象绑定到convertView上。 2. **适配器的实现**: - 自定义一个Adapter,继承自BaseAdapter...
在ListView中,每次滚动时,系统会复用已创建但不再显示的View,如果不使用ViewHolder,那么在复用过程中就需要不断查找View,这无疑增加了不必要的性能开销。 ViewHolder其实就是一个简单的Java类,它持有ListView...
Android ViewHolder示例 该项目的例子 将ViewHolder模式用于ListView 。 参见 对GridView使用ViewHolder模式。 请参阅 实施RecyclerView.ViewHolder为RecyclerView 。 请参阅 参考-> ...>将
在`getView()`方法(对于旧版的ListView)或`onBindViewHolder()`方法(对于RecyclerView)中,我们会使用ViewHolder来更新视图内容: ```java @Override public void onBindViewHolder(RecyclerView.ViewHolder ...
在这里,我们使用LayoutInflater从XML布局文件中加载视图,并将ViewHolder实例绑定到convertView上,这样在后续的滚动过程中,convertView非空,直接获取ViewHolder实例即可,避免了重复查找视图。 接着,根据数据...
3. 使用ViewHolder对象的成员变量来设置视图的内容,而不是使用findViewById()方法。 在项目中,我们可以通过CommAdapter这个类来实现通用Adapter和ViewHolder。这个类可能包含了创建ViewHolder的方法,以及处理...
以下是使用ViewHolder的一个基本步骤: 1. 创建ViewHolder类,包含需要绑定数据的View的成员变量。 2. 在`getView()`方法中,先检查convertView是否为null,如果不为null,直接转换为ViewHolder并填充数据;否则,...
如果不使用ViewHolder,系统会频繁地创建和销毁视图,这会消耗大量资源。ViewHolder的作用是缓存Item View中的子视图引用,避免每次绑定数据时都进行查找操作。 以下是一个简单的ViewHolder实现: ```java public ...
View的复用主要体现在当一个ViewHolder重新绑定数据时,如果其关联的View已经被其他ViewHolder使用过,那么这个View会直接被复用,而不需要重新绘制。 在源码分析中,我们可以看到这四级缓存是如何协同工作的。例如...
在Android开发中,ListView是一个非常重要的组件,它用于...在实际开发中,掌握ListView的使用和ViewHolder优化对于提升应用性能至关重要。通过不断实践和优化,开发者可以创建出高效、用户体验良好的数据展示界面。
然而,由于ViewHolder的复用性,有时会导致显示错乱的问题。本篇文章将深入探讨这个问题,并提供相应的解决方案。 一、RecyclerView的工作原理 1. ViewHolder模式:RecyclerView通过ViewHolder优化了ListView的...
在没有使用`ViewHolder`的情况下,每次`getView()`被调用时,都需要通过`findViewById()`方法找到对应的UI元素,这会消耗大量的时间和CPU资源。当列表滚动时,频繁的`getView()`调用会导致性能下降,界面滚动变得...
我们在使用ListView的时候,经常会使用的ViewHolder方式作为缓存,每次都需要手动的通过viewholder.icon = convertview.findVIewByid(id);一般的app都会有好几个页面会用到ListView,这样的话我们的代码量就会很大,...
把SparseArray绑定到一个view,SparseArray 初始化会分配10长度的地址,理论上会浪费了内存,但是这些都在允许范围内。省去了重复写viewholder的重复,重复。。自己留作纪念。