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开发不久。有问题,希望大家留言交流,共同成长!

时间: 2024-10-12 23:56:12

Android点滴---ViewHolder通用,优雅写法的相关文章

android中ViewHolder通用简洁写法

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> view

Cocos2dx-Android 之Makefile通用高级写法

不废话,直接贴,节约时间.需要改进的地方请各位指出,共同学习. LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILENAME := libcocos2dcpp ############################################################################### ##############

ViewHolder模式简洁写法

参考网址:http://blog.csdn.net/hmily7532361/article/details/18368235 在安卓中 自定义Adapter时,使用ViewHolder可缓存每个Item的View,减少一些不必要的操作,提高性能.在网上看到一种比较简洁的写法,避免每个自定义的Adapter定义ViewHolder实体类. import android.util.SparseArray; import android.view.View; /** * * @类名 ViewHold

Android应用程序通用自动脱壳方法研究

Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从一开始只有甲方公司提供服务到现在大型互联网公司都有自己的加固保护服务,同时与金钱相

[转载]Android应用程序通用自动脱壳方法研究

本文转载自: http://drops.wooyun.org/tips/9214 Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从

ViewHolder的改进写法

先看看ViewHolder通用写法         ViewHolder holder = null;         if(convertView == null){                 convertView = mInflater.inflate(R.layout.xxx null);                 holder = new ViewHolder();                 holder.tvXXX = (TextView)findViewById(

android下apkplug通用主题(皮肤)切换解决方案之主应用-01

该文章是基于apkplug V1.6.8 进行说明的 我们提供了一个demo做为参考,项目下载地址为:http://git.oschina.net/plug/IMThemeDemo 该 IMThemeDemo 实现了简单的聊天泡泡切换功能,同时主题包(插件)是托管在apkplug的云服务器上的.所以要阅读项目的完整代码可以先看插件托管服务开发系列文章 <插件托管服务开发指南> demo运行效果图: 一,apkplug的主题说明 apkplug主题解决方案摒弃了以往以图片替换的形式切换效果的方式

android数据库的升级的写法

在基类的table中加入upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbBaseTable"; /** * @return the DB table name */ abstract String getName(); /** * Creates the DB table according to the DB scheme * * @param db */ abst

ViewHolder模式超简洁写法,很cool!

ViewHolder是什么就不解释了.        大家通常怎么写ViewHolder呢? ViewHolder holder = null; if(convertView == null){ convertView = mInflater.inflate(R.layout.xxx null); holder = new ViewHolder(); holder.tvXXX = (TextView)findViewById(R.id.xxx); //...一连串的findViewById }