基于“ViewHolder”技术提升Android ListView中Item View加载效率
对于提升Android中频繁使用的ListView子Item View的加载效率,基于两点基本考虑:
1,Android的View的创建比较消耗资源;
2,findViewById()也不是最快的。
所以在实际开发中经常使用的适配器中的getView()方法:
public View getView(int position, View convertView, ViewGroup parent);
如果每次都在里面创建一个新View出来,将导致效率低下,比较高效率的做法是每次判断convertView是否为空,若不为空,则直接使用convertView的findViewById()把子View重建出来即可。
但是,这种做法虽然提升了效率,但仍不是最高效的做法,因为还是使用了findViewById()。
因此,进一步的效率提升改进之处是:使用一种称为“ViewHolder”的技术,缓存convertView中的View组件,使用convertView的setTag()和getTag(),每次当ListView需要创建Item的View时候,调用convertView的getTag()找出ViewHolder,重新复用。具体的使用方法如代码所示:
package zhangphil.listview; import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView lv = this.getListView(); setContentView(lv); ArrayAdapter adapter = new MyAdapter(this, android.R.layout.simple_list_item_2); lv.setAdapter(adapter); } private class MyAdapter extends ArrayAdapter { private int resId; private LayoutInflater mInflater; private ViewHolder holder = null; public MyAdapter(Context context, int resource) { super(context, resource); this.resId = resource; mInflater = LayoutInflater.from(context); } //子View的“容器” public final class ViewHolder { public TextView text1; public TextView text2; } @Override public int getCount() { //巨大的数据 return 10000; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(resId, null); holder = new ViewHolder(); holder.text1=(TextView) convertView.findViewById(android.R.id.text1); holder.text2=(TextView) convertView.findViewById(android.R.id.text2); convertView.setTag(holder); } else holder=(ViewHolder) convertView.getTag(); holder.text1.setText("text1:"+position); holder.text2.setText("text2:"+position); return convertView; } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。