适配器的getView()在每个位置之前要求位置0两次。 为什么?

我阅读了getView()上的所有其他post,但没有find任何解决方案。 我有一个带有SimpleCursorAdapter的GridView。 我记录(位置); 在getView()中,我看到这样的模式:

0,0,1,0,0,2,0,0,3,0,0,4,0,0,5等。这意味着我必须构建3个视图,因为它为每个显示的新视图滚动这是波涛汹涌和迟滞。 为什么这样做? 我没有任何明显的设置我的gridview包装内容或其他任何奇怪的东西。 我的代码没什么奇怪的。 可能有一个因素是每个项目视图可能具有不同的高度,具体取决于我正在显示的文本的长度。

我目前正在调试4.2.2 Galaxy Nexus。

在gridview measure / layout pass中请求索引0。

问题没有详细说明,但以下内容可以解释您所看到的模式:

  • GridView的布局需要两个度量/布局过程(例如,带LinearLayout重的LinearLayout ,带有布局依赖性规则的RelativeLayout )。 这解释了两个位置0。

  • 每个getView()都会导致父级重新布局。 这解释了每个位置后的位置0。

确保listview的高度不是wrap_content

并使其成为fill_parent。

希望有所帮助。

正如我在问题的评论中写的那样,我注意到在位置0上调用了getView()即使根本看不到该位置。 我认为原因是需要通过网格测量项目。

这种情况发生了一点点并没有让我感到困扰,但是当它完成很多并且向下滚动网格时,让我感到困扰,使网格变得很长。 特别是当它重新绘制甚至看不到的元素时。

我解决它的方式是,当请求getView(0)并且不应该看到项0时,意味着完成测量,我返回已经绘制的实际视图(重用转换后的视图),避免重新绘制位置0。

 @Override public View getView(int position, View convertView, ViewGroup parent) { // Workaround Android requesting position 0 even though it doesn't draw it. AbsListView listView = (AbsListView) parent; int firstVisiblePosition = listView.getFirstVisiblePosition(); if (position == 0 && firstVisiblePosition > 10) { if (convertView == null) { convertView = actualPaint(position, convertView, parent); } return convertView; } convertView = actualPaint(position, convertView, parent); return convertView; }