当前位置: 代码迷 >> Android >> 【Android开发心得】ViewHolder到底用什么修饰?static?final?static final
  详细解决方案

【Android开发心得】ViewHolder到底用什么修饰?static?final?static final

热度:79   发布时间:2016-04-28 02:49:05.0
【Android开发经验】ViewHolder到底用什么修饰?static?final?static final?

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

    现在大家都知道用ViewHolder来实现listview的优化了,但是,ViewHolder到底要用什么来修饰呢?这种修饰有什么意义呢?在一个ListView里面,存在多少个VIewHolder实例呢?为什么VIewHolder能够减少findview的次数,优化效率呢?为了弄清楚这个问题,我做了以下测试,测试代码很简单,就是下面这些

public class MainActivity extends Activity {	public static int itemId = 1;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		ListView listView = new ListView(this);		listView.setAdapter(new MyAdapter());		setContentView(listView);	}	private class MyAdapter extends BaseAdapter {		@Override		public int getCount() {			return 50;		}		@Override		public Object getItem(int position) {			return position;		}		@Override		public long getItemId(int position) {			return position;		}		@Override		public View getView(int position, View convertView, ViewGroup parent) {			ViewHolder viewHolder = null;			if (convertView == null) {				convertView = getLayoutInflater().inflate(R.layout.item,						parent, false);				viewHolder = new ViewHolder();				viewHolder.tv = (TextView) convertView.findViewById(R.id.tv);				convertView.setTag(viewHolder);			} else {				viewHolder = (ViewHolder) convertView.getTag();			}			viewHolder.tv.setText("item" + position);			Log.d("TAG", "position=" + position + "---" + viewHolder.toString());			return convertView;		}	}		private  class ViewHolder {//	private static class ViewHolder {//	private final class ViewHolder {//	private static final class ViewHolder {		private int id;		public ViewHolder() {			id = itemId;			Log.d("TAG", "ViewHolder" + id);			itemId++;		}		TextView tv;		@Override		public String toString() {			return "--------id=" + id;		}	}}

    我简单说一下代码是什么意思,ViewHolder有一个成员变量id,在toString()使用,用来区分不同的ViewHolder,在构造函数中,对id进行赋值,itemId是一个静态变量,每初始化一次就+1,我们可以根据构造函数的打印次数,来计算ViewHolder的实例化次数,根据toString()可以来判断到底是使用了哪一个ViewHolder。getVIew中的写法是固定的,下面是测试结果:


    private class ViewHolder修饰,界面内可见的item数量是9个,ViewHolder初始化了10次,之后开始复用ViewHolder。


    private static class ViewHolder修饰,界面内可见的item数量是9个,ViewHolder初始化了10次,之后开始复用ViewHolder。


    private final class ViewHolder修饰,界面内可见的item数量是9个,ViewHolder初始化了10次,之后开始复用ViewHolder。


    private static final class ViewHolder修饰,完全一样!



    其实一上来我就贴一张图就ok了,因为这几种完全一样,不管用什么修饰,ViewHolder都会初始化当前界面可见item的数量+1次,和convertView的实例化次数是一样的,因此,我么不管使用什么修饰都是没问题的,也是没必要的。

    static修饰类,在这里是静态内部类,并不是说只存在一个实例,而是可以访问外部类的静态变量,final修饰类则是不让该类继承,我们这里使用final毫无根据,所以,以后写ViewHolder的时候,可以不纠结了,加什么加啊,什么都不用加!

1楼nightyk2小时前
这问题我也纠结过,谢谢博主啦
  相关解决方案