listview的ViewHolder为什么要用static

答案整理: 本人非常赞同1

1

https://teamtreehouse.com/community/why-was-the-viewholder-class-declared-as-a-static-class

一般来说,我们声明为静态嵌套类,当它没有依赖外部类。在我们的例子中,ViewHolder类从未引用(访问)适配器类的任何成员变量(外部类),因此我们可以声明为静态的。保持简单nested-static类只是另一个(外)类是嵌套的可读性,因为它的使用仅限于只有它的外部类。你必须宣布非静态嵌套类(称为内部类)如果访问外部类的成员变量。

2

《Effective Java》第22条 优先考虑静态成员类 其中有条建议: 如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中,使它成为静态成员类,而不是非静态成员类。 因为非静态成员类的实例会包含一个额外的指向外围对象的引用,保存这份引用要消耗时间和空间,并且导致外围类实例符合垃圾回收时仍然被保留。如果没有外围实例的情况下,也需要分配实例,就不能使用非静态成员类,因为非静态成员类的实例必须要有一个外围实例。

PS:强烈推荐《Effective Java》这本书,会让你有意想不到的收获。

文/CPPAlien(简书作者) 原文链接:http://www.jianshu.com/p/aa965968cbf5

3

这篇文章中没有提到加载时机的问题吧。在我的理解中:静态内部类主要作用就是,内部类是否需要隔离“外部类的this对象(指针)”。内部类是有 this 指针的,可以“直接”访问外部类的 成员变量和成员函数(包括私有的成员)。而静态内部类,没有这个this指针,所以无法“直接”调用。

Android代码中,经常使用的Builder,LayoutParams都是以静态内部类的方式存在啊。我们可以根据实际使用情况来效仿。


对于这篇文章,我理解。ViewHolder的构造和复用,与静不静态没关。核心是ListView(AdapterView),通过getView(int position, View convertView, ViewGroup parent) 的convertView会为开发者传入一个可以复用的对象。开发者需要利用该对象,减少应用内存的消耗。 如果从减少内存消耗的角度来开。我认为ViewHolder还是应该修饰成static比较好。这样ViewHolder中可以减少MainActivity的this指针,由于减少了一个this指针的引用,也会对MainActivity的引用计数大大减少。MainActivity的this指针继承于android的Context上下文,对于Context的回收遗漏,是Android内存管理中很大的问题。我们减少了对Context的引用,可以更容易减少Context引用计数出现问题。

4

http://stackoverflow.com/questions/13516835/why-in-viewholder-pattern-should-the-viewholder-class-be-static My opinion is that it is better to have the ViewHolder class static as it won't leak the Adapter. If the adapter retains some heavy Collections or even Views (depends on each particular case), it would be great to keep control of which objects retain the Adapter. Having a lot of objects instances of an inner class will have those objects referencing the Adapter, thus retaining it. You should be careful about how the tags are managed (if the views are cleaned/removed automatically there is no problem>).

在Android中,ListView是一个常见的用于显示列表数据的组件。为了提高性能并减少内存消耗,ListView使用View Holder设计模式。View Holder的作用是在每个ListItem不再需要时复用其视图,而不是每次滚动时都创建新的View。 举个例子,假设我们有一个简单的Adapter,它负责将List<YourItem>的数据填充到ListView: ```java public class YourListAdapter extends ArrayAdapter<YourItem> { private ViewHolder viewHolder; public static class ViewHolder { TextView textViewName; ImageView imageViewIcon; // 其他可能的视图... } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_view, parent, false); viewHolder.textViewName = convertView.findViewById(R.id.text_view_name); viewHolder.imageViewIcon = convertView.findViewById(R.id.image_view_icon); // 绑定ViewHolder convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } YourItem item = getItem(position); viewHolder.textViewName.setText(item.getName()); viewHolder.imageViewIcon.setImageResource(item.getIconResourceId()); return convertView; } } ``` 在这个例子中,当列表滚动时,如果`convertView`(已经缓存的视图)不是null,我们就直接复用它;如果`convertView`是null,我们就新创建一个,并将其放入缓存。这样可以显著减少垃圾回收的工作量,提升应用程序的响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值