`
flex_莫冲
  • 浏览: 1092409 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

viewholder的使用

 
阅读更多
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;
	}
}

分享到:
评论
5 楼 guduxing890 2014-03-31  
小坑。。   mmsList.size();   哪来的。。  代码不完整。
4 楼 xiaohexing374 2011-11-07  
3 楼 flex_莫冲 2011-09-13  
xiaojian623 写道
好乱的代码~~~

哈哈。谢谢。
2 楼 xiaojian623 2011-09-13  
个人按理解分段的代码:
  
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; 
    } 
} 
1 楼 xiaojian623 2011-09-13  
好乱的代码~~~

相关推荐

    ListView使用ViewHolder模式提高效率

    "ListView使用ViewHolder模式提高效率"这一主题就是解决这个问题的关键知识点。 ViewHolder模式是Android开发中为了提升ListView性能而设计的一种优化策略。它通过减少findViewById的调用来改善视图的绘制速度。在...

    ListView的优化使用-抽取ViewHolder以及adapter类

    // 使用viewHolder填充数据 viewHolder.textView.setText(items.get(position)); viewHolder.imageView.setImageResource(imageIds[position]); // 设置其他视图的数据... return convertView; } ``` 3. **...

    ViewHolder超级简洁写法

    这里的关键步骤是使用convertView.getTag()获取ViewHolder实例,如果convertView为空,就创建一个新的ViewHolder并与convertView关联。这样,当ListView项被重用时,我们可以通过ViewHolder快速访问到对应的View,而...

    Android ViewHolder的超简洁写法Demo

    在上述代码中,我们使用SparseArray来存储ViewHolder对象,当需要创建新的ViewHolder时,我们先检查SparseArray中是否存在对应位置的对象,如果存在则直接复用,否则才创建新的ViewHolder并添加到SparseArray中。...

    ViewHolder

    超简洁ViewHolder,直接加入工具类就可以了

    viewHolder封装工具类

    // 在Adapter中使用 @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return ViewHolderUtils.create(parent, R.layout.item_layout); } @Override public void ...

    万能listView ViewHolder适配器

    - 在getView()方法中,首先检查convertView是否为空,如果不为空则直接使用,否则创建新的convertView,并将ViewHolder对象绑定到convertView上。 2. **适配器的实现**: - 自定义一个Adapter,继承自BaseAdapter...

    ViewHolder的应用

    在ListView中,每次滚动时,系统会复用已创建但不再显示的View,如果不使用ViewHolder,那么在复用过程中就需要不断查找View,这无疑增加了不必要的性能开销。 ViewHolder其实就是一个简单的Java类,它持有ListView...

    Android-ViewHolder-Example:Android ViewHolder模式示例

    Android ViewHolder示例 该项目的例子 将ViewHolder模式用于ListView 。 参见 对GridView使用ViewHolder模式。 请参阅 实施RecyclerView.ViewHolder为RecyclerView 。 请参阅 参考-> ...>将

    ViewHolder和Adapter 工具类

    在`getView()`方法(对于旧版的ListView)或`onBindViewHolder()`方法(对于RecyclerView)中,我们会使用ViewHolder来更新视图内容: ```java @Override public void onBindViewHolder(RecyclerView.ViewHolder ...

    利用ViewHolder优化自定义Adapter的典型写法

    在这里,我们使用LayoutInflater从XML布局文件中加载视图,并将ViewHolder实例绑定到convertView上,这样在后续的滚动过程中,convertView非空,直接获取ViewHolder实例即可,避免了重复查找视图。 接着,根据数据...

    ListView ,GridView 通用Adapter ViewHolder

    3. 使用ViewHolder对象的成员变量来设置视图的内容,而不是使用findViewById()方法。 在项目中,我们可以通过CommAdapter这个类来实现通用Adapter和ViewHolder。这个类可能包含了创建ViewHolder的方法,以及处理...

    万能的Adapter和ViewHolder

    以下是使用ViewHolder的一个基本步骤: 1. 创建ViewHolder类,包含需要绑定数据的View的成员变量。 2. 在`getView()`方法中,先检查convertView是否为null,如果不为null,直接转换为ViewHolder并填充数据;否则,...

    ListViewAdapter和ViewHolder代码,安卓listview适配器.rar

    如果不使用ViewHolder,系统会频繁地创建和销毁视图,这会消耗大量资源。ViewHolder的作用是缓存Item View中的子视图引用,避免每次绑定数据时都进行查找操作。 以下是一个简单的ViewHolder实现: ```java public ...

    RecyclerView的四级缓存源码分析

    View的复用主要体现在当一个ViewHolder重新绑定数据时,如果其关联的View已经被其他ViewHolder使用过,那么这个View会直接被复用,而不需要重新绘制。 在源码分析中,我们可以看到这四级缓存是如何协同工作的。例如...

    android_listView组件的使用_添加viewHolder机制

    在Android开发中,ListView是一个非常重要的组件,它用于...在实际开发中,掌握ListView的使用和ViewHolder优化对于提升应用性能至关重要。通过不断实践和优化,开发者可以创建出高效、用户体验良好的数据展示界面。

    Recyclerview由于ViewHolder的复用显示错乱问题解决

    然而,由于ViewHolder的复用性,有时会导致显示错乱的问题。本篇文章将深入探讨这个问题,并提供相应的解决方案。 一、RecyclerView的工作原理 1. ViewHolder模式:RecyclerView通过ViewHolder优化了ListView的...

    android 通用的ViewHolder实现

    在没有使用`ViewHolder`的情况下,每次`getView()`被调用时,都需要通过`findViewById()`方法找到对应的UI元素,这会消耗大量的时间和CPU资源。当列表滚动时,频繁的`getView()`调用会导致性能下降,界面滚动变得...

    android listview viewholder

    我们在使用ListView的时候,经常会使用的ViewHolder方式作为缓存,每次都需要手动的通过viewholder.icon = convertview.findVIewByid(id);一般的app都会有好几个页面会用到ListView,这样的话我们的代码量就会很大,...

    viewholder模式的简介写法

    把SparseArray绑定到一个view,SparseArray 初始化会分配10长度的地址,理论上会浪费了内存,但是这些都在允许范围内。省去了重复写viewholder的重复,重复。。自己留作纪念。

Global site tag (gtag.js) - Google Analytics