我有ListView
个自定义Adapter
。说实话,我在屏幕上同时有很多这些,而我的Tegra 3设备开始滞后,让我感到困惑的是......我发现每个ListView
Adapter
getView()
为屏幕上运行的所有可见行每时间任何动画调用measure()
方法。这给了我每秒几百个电话!进一步挖掘,这些调用大部分来自onMeasure()
和父母的ListView
ListView
来电,而且 - 这是关键 - 它们没用,因为我的所有布局{ {1}}š
有const大小。
所以我的问题是:如何消除这些电话?当然,我想单独留下正确的电话(因为将项目添加到Adapter
和notifyDataSetChanged()
)。
我几乎尝试过任何事情,但是整个列表都没有绘制自己(当我覆盖它的onMeasure()
并强制返回const大小而不调用super.onMeasure()
)或者在某个时候停止更新
答案 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()
,它会从列表适配器请求一个视图。因此,如果您的观点通过动画进行重新测量,那么您的表现将非常糟糕。