有一个简单的问题,在搜索后我想问问为什么我们创建静态持有者类并为其分配视图?请清除我的疑惑,这对我很有帮助。适配器类中的持有者类
回答
在滚动ListView
期间,您的代码可能会频繁地调用findViewById()
,这可能会降低性能。即使适配器返回回收的充气视图,您仍然需要查找元素并进行更新。围绕重复使用findViewById()
的方式是使用设计模式。
A ViewHolder
对象将每个组件视图存储在Layout的标签字段内,因此您可以立即访问它们而无需重复查看它们。首先,您需要创建一个类来保存一组精确的视图。
您可以阅读Android Guideline了解更多详情。
- 所以,当你使用“查看持有人”,那么你可以很容易地访问每个视图,而无需查找,从而节省宝贵的处理器周期。
- 具有对意见
static inner class
极大地提高了性能
你还可以看到Why does Android prefer static classes链接。
一个更有趣的链接How ListView Work,阅读这个博客开发者可以清除LisView的逻辑也是为什么需要实现内部静态类的ListView之后。
这是一个优化点。没有viewHolder,你需要每次调用findViewById方法。使用viewHolder,你只需要调用一次。
没有ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); } //Following called each time TextView tv = (TextView)convertView.findViewById(...); ImageView iv = (ImageView)convertView.findViewById(...); tv.setText(...)
随着ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); holder = new ViewHolder(); //called once holder.tv = (TextView) vi.findViewById(..); holder.iv = (ImageView) vi.findViewById(...); vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } holder.tv.setText(...)
答案也很简单,如果你
与一个TextView和ImageView的例子了解如何一个AdapterView
的作品。
一个AdapterView
是一个视图,其子视频由Adapter
决定。 AdapterView
(更具体地说是具体的实施例,如ListView
)包含比任何给定时间显示的更多信息。为了优化内存消耗并且为了性能,Adapter
通常重用代表单个项目的View
。因此,您的对象数量少于相应的数据。
重复使用的对象可能是复杂的层次结构View
s或ViewGroups
。因此,如果您想要在此层次结构中找到个别对象View
,则需要依赖findViewById()
方法,并且当视图层次结构具有多个级别时,这会变得代价高昂。所以为了简单(也为了提高性能),我们使用View-Holder模式,我们感兴趣的单个对象被分配给一个静态内部类。
有关View-Holder模式的更多信息,请参阅Lars Vogel的Android ListView and ListActivity - Tutorial。
- 1. 适配器模式:类适配器与对象适配器
- 2. 使用“高效适配器”时,持有者有时为空
- 3. RecyclerView和java.lang.IndexOutOfBoundsException无效的视图持有者适配器positionViewHolder
- 4. 如何从适配器类
- 5. Android - 持有者从recyclerView适配器项目位置返回null
- 6. Butterknife不适用于适配器类
- 7. C#:支持多种类型的数据库表与适配器
- 8. VirtualBox的:英特尔适配器类型不受支持
- 9. 适配器类:嵌套在活动中?
- 10. 数据类中的适配器类vs toXXX()方法
- 11. Rails Mysql适配器试图查询没有支持表的抽象模型类
- 12. 与纪录保持者服装适配器问题
- 13. ClickListener从适配器到其他类
- 14. setActivityForResult()在自定义适配器类
- 15. java类/接口适配器问题
- 16. 嵌套类适配器模式?
- 17. 数组pojo类与内部数组类的RecyclerView适配器
- 18. 适配器类是否使用Event类的方法?
- 19. 具有静态类的适配器模式
- 20. 对象适配器模式和类适配器模式之间的区别
- 21. 如何获取回调类中的视图持有者项目
- 22. 如何在改装的适配器类中传递该类型的json数据?
- 23. 创建通用类型适配器类不工作
- 24. 在适配器类以外的活动中定义RecyclerView的onCLickListener
- 25. 适配器坚持旧的ArrayList
- 26. C++类持有其他类
- 27. 得分忍者适配器API
- 28. 将RecyclerView适配器类中的JSON数组传递给活动类
- 29. 在listView自定义适配器中获取父视图支持者
- 30. 如何关闭适配器类中的导航抽屉
请帮我。 – user1537629 2012-07-19 11:16:00
您的问题是关于“静态”限定符,还是一般的ViewHolder?您是否阅读过文档:http://developer.android.com/training/improving-layouts/smooth-scrolling.html – 2014-03-03 20:55:51