zoukankan      html  css  js  c++  java
  • ViewHolder的标准写法

    最标准的写法,就是为每一个AdapterView的子View新建一个对应的ViewHolder,同时声明为prtivate final static。ViewHolder类中定义各种成员变量。

        public final static class ViewHolder{
            ImageView iv;
            TextView text;
            Button btn;
        }

     在适配器的getView()方法中我们一般会这么写:

    public View getView(int position, View convertView, ViewGroup parent) {
     
    ViewHolder holder;
     
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.text);
        convertView.setTag(holder);
     
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
     
    holder.text.setText("line" + position);
      return convertView;
    }
     
    private class ViewHolder {
      TextView text;
    }

    常规方法介绍完毕,我们现在找到了一个等价的作法,而且代码很简洁。

    ViewHolder中写了一个静态方法,用泛型提供了高扩展性。我们可以通过get方法得到各种view的子类,比如imageView,button,TextView之类的。

    public class ViewHolder {
            // I added a generic return type to reduce the casting noise in client code  
            @SuppressWarnings("unchecked")
            public static <T extends View> T get(View view, int id) {
                SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
                if (viewHolder == null) {
                    viewHolder = new SparseArray<View>();
                    view.setTag(viewHolder);
                }
                View childView = viewHolder.get(id);
                if (childView == null) {
                    childView = view.findViewById(id);
                    viewHolder.put(id, childView);
                }
                return (T) childView;
            }
        }

    在适配器中,我们可以进行如下配置(仅仅是举例)

        @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                if (convertView == null) {
                    // init convertView by layout
                    convertView = LayoutInflater.from(context.inflate(R.layout.item, parent, false));
                }
                ImageView imageView = ViewHolder.get(convertView, R.id.imageView_id);
                imageView.setImageResource(R.drawable.ic_launcher);
                
                return convertView;
            }

    这里的知识点是SparseArray<View>,SparseArray<View>在代码理解上等价于HashMap<Interger, View>,SparseArray是Android提供的一个数据结构,旨在提高查询的效率。所以View childView = viewHolder.get(id);这句代码的时间上的开销是极小的,完全不会影响到执行的效率。

    参考自:

    http://my.oschina.net/jack1900/blog/289164

    http://blog.csdn.net/hmily7532361/article/details/18368235

  • 相关阅读:
    传奇版本自动穿背包中的装备脚本
    MaxM2引擎各种人物触发脚本
    异或加密解密代码
    中元节
    网络加密
    MCMD Commander 命令解释及说明
    Ubuntu字符界面与图形界面切换
    传奇服务端各文件用途说明
    传奇数据库说明
    传奇MAP地图说明
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/4157889.html
Copyright © 2011-2022 走看看