listview--Java泛型应用之打造Android万能ViewHolder-超简洁写法

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010785585/article/details/52808656

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52808656 【DylanAndroid的csdn博客】


在ListView的Adapter中的getView()方法中的繁琐写法

@Override  
public View getView(int position, View convertView, ViewGroup parent) {  
    ViewHolder viewHolder = null;
    if (convertView == null) {  
        convertView = LayoutInflater.from(context)  
          .inflate(R.layout.item, parent, false);  
          viewHolder = new ViewHolder();
          viewHolder.name = (TextView) convertView.findViewById(R.id.name);
           convertView.setTag(viewHolder);
    }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }

  viewHolder.name.setText("sss"); 

    return convertView;  
}  
private static class ViewHolder
    {
        TextView name;
    }

先了解一下SparseArray

SparseArray(稀疏数组).他是Android内部特有的api,标准的jdk是没有这个类的.在Android内部用来替代HashMap<Integer,E>这种形式,使用SparseArray更加节省内存空间的使用,SparseArray也是以key和value对数据进行保存的.使用的时候只需要指定value的类型即可.并且key不需要封装成对象类型.

最后经过优化和简化后的代码

  • 代码

/**
 * Created by yuandl on 2016-10-13.
 */

import android.util.SparseArray;
import android.view.View;

/**
 * 万能的ViewHolder
 *
 * @author
 */
public class CommonViewHolder {
    /**
     * @param view 所有缓存View的根View
     * @param id   缓存View的唯一标识
     * @return
     */
    public static <T extends View> T get(View view, int id) {

        SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
        //如果根view没有用来缓存View的集合
        if (viewHolder == null) {
            viewHolder = new SparseArray<View>();
            view.setTag(viewHolder);//创建集合和根View关联
        }
        View chidlView = viewHolder.get(id);//获取根View储存在集合中的孩纸
        if (chidlView == null) {//如果没有改孩纸
            //找到该孩纸
            chidlView = view.findViewById(id);
            viewHolder.put(id, chidlView);//保存到集合
        }
        return (T) chidlView;
    }
}
  • 用法(可以看到省去了好多代码)
@Override  
public View getView(int position, View convertView, ViewGroup parent) {  

    if (convertView == null) {  
        convertView = LayoutInflater.from(context)  
          .inflate(R.layout.item, parent, false);  
    }  

    TextView name= CommonViewHolder.get(convertView, R.id.name);  

    name.setText("sss");  

    return convertView;  
}  

GitHub源码地址https://github.com/linglongxin24/ListViewUpdate/blob/master/app/src/main/java/cn/bluemobi/dylan/listviewupdate/adapter/CommonViewHolder.java

--------------------- 本文来自 DylanAndroid 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/linglongxin24/article/details/52808656?utm_source=copy 

posted on 2018-10-05 13:51  左手指月  阅读(401)  评论(0编辑  收藏  举报