说ViewHolder

比较简单的内部类viewholder是比较好理解的,是在adapter中定义的一个静态内部类。

为什么是静态内部类呢?首先要说到静态内部类和非静态内部类的主要区别:非静态内部类会隐式地持有外部类的引用,而静态内部类不会。

声明ViewHolder静态内部类,可以将ViewHolder和外部类解引用。一般ViewHolder都很简单,不定义为static也没事。不过你将它定义为static的,显得更合理/更专业,这一点足够。

在项目开发中我们用的是下面的这种比较优化的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 convertView, int id) {
		// SparseArray同HashMap<Integer,T>,是其一种优化
		SparseArray<View> viewArray = (SparseArray<View>) convertView.getTag();
		if (viewArray == null) {
			viewArray = new SparseArray<View>();
			convertView.setTag(viewArray);
		}
		View childView = viewArray.get(id);
		if (childView == null) {
			childView = convertView.findViewById(id);
			// 存入view
			viewArray.put(id, childView);
		}
		return (T) childView;
	}
}


ViewHolder是一种在Android开发中提高ListView、RecyclerView等列表视图性能的设计模式。 ### 定义 ViewHolder通过在getView()方法返回的视图的标签(Tag)中存储一个数据结构,该数据结构包含指向要绑定数据的视图的引用,以此避免每次调用getView()时都调用findViewById() [^1]。 ### 使用方法 使用时,先定义一个ViewHolder,其中包含需要绑定数据的视图引用。在getView()方法中,若convertView为空,进行视图的初始化和ViewHolder的创建,并将ViewHolder设置为convertView的tag;若convertView不为空,则直接从convertView的tag中获取ViewHolder。示例代码如下: ```java static class ViewHolder { TextView text; ImageView icon; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text, parent, false); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(DATA[position]); holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); return convertView; } ``` ### 作用 使用ViewHolder可以轻松实现视图的复用,减少视图的创建和销毁操作,这对于内存消耗较大的应用来是一个显著的优化。同时,由于减少了视图查找时间,能够提升数据绑定的效率,从而在用户滚动时提供更流畅的体验 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值