ListView getView()经常被调用

时间:2012-03-30 10:10:18

标签: android listview adapter

我有ListView个自定义Adapter。说实话,我在屏幕上同时有很多这些,而我的Tegra 3设备开始滞后,让我感到困惑的是......我发现每个ListView Adapter getView()为屏幕上运行的所有可见行时间任何动画调用measure()方法。这给了我每秒几百个电话!进一步挖掘,这些调用大部分来自onMeasure()和父母的ListView ListView来电,而且 - 这是关键 - 它们没用,因为我的所有布局{ {1}}š 有const大小。

所以我的问题是:如何消除这些电话?当然,我想单独留下正确的电话(因为将项目添加到AdapternotifyDataSetChanged())。

我几乎尝试过任何事情,但是整个列表都没有绘制自己(当我覆盖它的onMeasure()并强制返回const大小而不调用super.onMeasure())或者在某个时候停止更新

4 个答案:

答案 0 :(得分:3)

你是如何实现getView()方法的?如果以正确的方式实施它,几乎没有滞后。

看看这个非常好的视频:

正如罗曼所说,与它合作不是反对它。最好是单独留下measure()并专注于你的适配器。

答案 1 :(得分:3)

如何实施 ListView ..我认为这不会导致性能开销......如果您在那里做得恰到好处..

例如......

不要在GetView方法中实现LayoutInflator,在类级别执行..

只有当convertView==null或者只是返回convertView时才会进行通货膨胀视图。充气视图是一个代价高昂的过程......

答案 2 :(得分:3)

好像您说这些来电是onMeasure()ListViews来自height=wrap_content父母的电话,我确定您使用wrap_content同时使用ListView 1}}如果你的身高发生了变化,你的height=fill_parent将不停地检查身高。

所以解决方案是来放置build.gradle。 我希望这能帮助你。

答案 3 :(得分:2)

这个的根本原因是ListView.onMeasure()调用AbsListView.obtainView(),它会从列表适配器请求一个视图。因此,如果您的观点通过动画进行重新测量,那么您的表现将非常糟糕。