• Android点滴---ViewHolder通用,优雅写法



    近期在做项目时,又要写 ViewHolder。

    突然想到网上看看有没什么好的写法!


    不知道你是不是也烦透了写那些没有技术含量的ViewHolder

    看看这些。也许会有收获!


    然后就找到了以下两篇文章(感谢分享!

    ):


    ViewHolder超简洁写法 点击跳转


    优雅的使用ViewHolder 点击跳转


    然后自己整理的了, 保存起来。省的忘记。顺便分享一下!


    直接贴代码了:


    第一种:
    import android.util.SparseArray;
    import android.view.View;
    
    /**
     * ViewHolder 的通用写法
     * 
     * 来自 : http://www.eoeandroid.com/thread-321547-1-1.html
     * 
     * @author LiuJinpeng
     *
     */
    public class ViewHolder {
    	
    	private ViewHolder() {}
    
    	@SuppressWarnings("unchecked")
    	public static <T extends View>T getChildView(View convertView,int id) {
    		
    		SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag();
    		
    		if (viewHolder == null) {
    			viewHolder = new SparseArray<View>();
    			convertView.setTag(viewHolder);
    		}
    		
    		View childView = viewHolder.get(id);
    		
    		if (childView == null) {
    			childView = convertView.findViewById(id);
    			viewHolder.put(id, childView);
    		}
    		
    		return (T) childView;
    	}
    	
    }

    用法:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        if (convertView == null) {
            convertView = LayoutInflater.from(context)
              .inflate(R.layout.banana_phone, parent, false);
        }
    
        ImageView bananaView = ViewHolder.get(convertView, R.id.banana);
        TextView phoneView = ViewHolder.get(convertView, R.id.phone);
    
        BananaPhone bananaPhone = getItem(position);
        phoneView.setText(bananaPhone.getPhone());
        bananaView.setImageResource(bananaPhone.getBanana());
    
        return convertView;
    }

    另外一种:
    import android.util.SparseArray;
    import android.view.View;
    
    /**
     * ViewHolder 优雅写法
     * 
     * 来自:http://stackvoid.com/using-adapter-in-efficiency-way/
     * 
     * @author LiuJinpeng
     *
     */
    public class ViewHolder2 {
    
    	private final SparseArray<View> views;
    	
    	private View convertView;
    	
    	private ViewHolder2(Context context, int layoutId) {
    		super();
    		this.views = new SparseArray<View>();
    
    		this.convertView = View.inflate(context, layoutId, null);
    		
    		convertView.setTag(this);
    	}
    	
    
    	/**
    	 * 获取 holder
    	 * 
    	 * @param context
    	 * @param convertView	getView 的 convertView
    	 * @param layoutId		item View 的  布局文件 id
    	 * @return
    	 */
    	public static ViewHolder2 getHolder(Context context, View convertView,int layoutId) {
    		
    		if (convertView.getTag() == null) {
    			return new ViewHolder2(context, layoutId);
    		}
    		
    		return (ViewHolder2) convertView.getTag();
    	}
    
    	@SuppressWarnings("unchecked")
    	public <T extends View>T getChildView(int viewId) {
    		View childView = views.get(viewId);
    		
    		if (childView == null) {
    			childView = convertView.findViewById(viewId);
    			views.put(viewId, childView);
    		}
    		
    		return (T) childView;
    	}
    
    	public View getConvertView() {
    		return convertView;
    	}
    
    }


    用法:

    public View getView(int position, View convertView, ViewGroup parent) {
    
    		ViewHolder mViewHolder = ViewHolder.get(context,convertView,layoutId);
    		TextView price = mViewHolder.getView(R.id.price);
    		// ...其它getView
    
    		return mViewHolder.getConvertView();
    	}


    当中第一篇文章还分享了一个框架:

    base-adapter-helper 点击打开链接


    临时没时间研究,有兴趣的同学能够看一下!


    从事Android开发不久。有问题,希望大家留言交流,共同成长!



  • 相关阅读:
    Linux下校验下载文件的完整性(MD5,SHA1,PGP)
    十六进制字节 & 十六进制转二进制
    session & cookie
    php与mysql的链接到底用mysql 还是mysqli,pdo
    php连接数据库时候的字符集设置
    Prepared statements(mysqli & pdo)
    shell脚本中执行mysql命令
    centos系统字符编码问题
    实用crontab命令
    shell获取用户输入
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5059486.html
Copyright © 2020-2023  润新知