程序员人生 网站导航

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

栏目:综合技术时间:2015-02-09 08:34:44

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

    现在大家都知道用ViewHolder来实现listview的优化了,但是,ViewHolder到底要用甚么来修饰呢?这类修饰有甚么意义呢?在1个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; } } }

    我简单说1下代码是甚么意思,ViewHolder有1个成员变量id,在toString()使用,用来辨别不同的ViewHolder,在构造函数中,对id进行赋值,itemId是1个静态变量,每初始化1次就+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修饰,完全1样!



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

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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐