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

时间:2014-01-23 07:58:16

标签: android android-listview

我在getView()上阅读了所有其他帖子,但没有找到任何解决方案。我有一个带有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。

3 个答案:

答案 0 :(得分:1)

在gridview度量/布局传递中请求索引0。

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

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

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

答案 1 :(得分:0)

确保listview的高度不是wrap_content

并使其成为fill_parent。

希望有所帮助。

答案 2 :(得分:0)

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

这一点并没有让我感到困扰,但是当它做了很多事情并且向下滚动网格时,让我很困扰。特别是当它重新绘制甚至看不到的元素时。

我解决它的方法是,当请求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;
}