我知道当您使用带有ListView
的{{1}}和布局资源时,您应该使用视图持有者模式重用ArrayAdapter
以提高平滑度例如滚动。
如果使用convertView
动态生成ListView
的项目并使用new RelativeLayout(context)
添加内容,该怎么办?在这种情况下,我应该使用类似于视图持有者模式的东西来重用addView()
吗?通过这个我的意思是这样的。
RelativeLayout
使用视图持有者模式是为了避免实例化RelativeLayout relativeLayout = (RelativeLayout) convertView.getTag();
relativeLayout.removeAllViews();
// Now add all the required Views.
对齐的新实例,还是使用视图持有者模式避免从膨胀资源中调用RelatativeLayout
的主要原因?< / p>
答案 0 :(得分:3)
我同意@ ivan-bartsov并将补充说,两种操作,即通货膨胀和通过ID查找视图,都是昂贵的,并且是ViewHolder模式可行的原因。
我也想提一下。如果你有一定数量的视图组合,比如说1,2,3或者甚至4,那么覆盖Adapter.getViewTypeCount
和Adapter.getItemViewType
是一个非常好的主意,这样你就可以利用内置ViewHolder / Recycling功能,用于不同的项目布局。框架将正确地为您提供给定位置的正确convertView。
最后需要注意的是,有时数据的结构将会更有意义地使用ExpandableListView或类似的小部件,这些小部件将为子视图提供开箱即用的视图回收,所以你不要这样做。必须自己给它们充气。
答案 1 :(得分:1)
是的,你绝对应该使用ViewHolder
。手动视图创建方案与您膨胀时没有太大区别。
使用视图持有者模式来避免实例化新实例 RelatativeLayout合理或是使用的主要原因 查看持有者模式以避免从
findViewById
的所有调用 膨胀的资源?
实际上,通过检查RelativeLayout
convertView
的{{1}}参数来避免getView(int position, View convertView, ViewGroup parent)
(或其他)的冗余实例化,您应该在创建时null
执行相同操作手动查看。
您仍然需要一种方式来访问您的子视图(TextView
或您拥有的内容),因此您可以使用手动制作的ID或标签来搜索或使用ViewHolder
来存储对象引用(当然,更快)