查看动态创建的ListView项目的持有者模式

时间:2015-09-02 16:26:10

标签: android listview android-listview android-arrayadapter

我知道当您使用带有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>

2 个答案:

答案 0 :(得分:3)

我同意@ ivan-bartsov并将补充说,两种操作,即通货膨胀和通过ID查找视图,都是昂贵的,并且是ViewHolder模式可行的原因。

我也想提一下。如果你有一定数量的视图组合,比如说1,2,3或者甚至4,那么覆盖Adapter.getViewTypeCountAdapter.getItemViewType是一个非常好的主意,这样你就可以利用内置ViewHolder / Recycling功能,用于不同的项目布局。框架将正确地为您提供给定位置的正确convertView。

最后需要注意的是,有时数据的结构将会更有意义地使用ExpandableListView或类似的小部件,这些小部件将为子视图提供开箱即用的视图回收,所以你不要这样做。必须自己给它们充气。

答案 1 :(得分:1)

是的,你绝对应该使用ViewHolder。手动视图创建方案与您膨胀时没有太大区别。

  

使用视图持有者模式来避免实例化新实例   RelatativeLayout合理或是使用的主要原因   查看持有者模式以避免从findViewById的所有调用   膨胀的资源?

实际上,通过检查RelativeLayout convertView的{​​{1}}参数来避免getView(int position, View convertView, ViewGroup parent)(或其他)的冗余实例化,您应该在创建时null执行相同操作手动查看。

您仍然需要一种方式来访问您的子视图(TextView或您拥有的内容),因此您可以使用手动制作的ID或标签来搜索或使用ViewHolder来存储对象引用(当然,更快)