自定义列表视图适配器 getView 方法被多次调用,并且顺序不一致

新手上路,请多包涵

我有一个自定义列表适配器:

 class ResultsListAdapter extends ArrayAdapter<RecordItem> {

在覆盖的“getView”方法中,我打印以检查位置是什么以及它是否是 convertView:

     @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        System.out.println("getView " + position + " " + convertView);

这个的输出(第一次显示列表时,还没有用户输入)

 04-11 16:24:05.860: INFO/System.out(681): getView 0 null
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8
04-11 16:25:50.251: INFO/System.out(681): getView 1 null
04-11 16:26:01.300: INFO/System.out(681): getView 2 null
04-11 16:26:02.020: INFO/System.out(681): getView 3 null
04-11 16:28:28.091: INFO/System.out(681): getView 0 null
04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0

AFAIK,虽然我找不到明确说明,但仅针对可见行调用 getView() 。因为我的应用程序以四个可见行开始,所以至少从 0-3 循环的位置数字是有意义的。但剩下的就是一团糟:

  • 为什么每行调用 getview 三次?
  • 当我还没有滚动时,这些 convertViews 从哪里来?

我做了一些研究,但没有得到很好的答案,我确实注意到人们将这个问题与布局问题联系起来。因此,以防万一,这是包含列表的布局:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:orientation="vertical" >

    <TextView android:id="@+id/pageDetails"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <ListView android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="false" />

</LinearLayout>

以及每一行的布局:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"
android:padding="4dp">

<ImageView
    android:id="@+id/thumb"
    android:layout_width="120dp"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginRight="8dp"
    android:src="@drawable/loading" />

<TextView
    android:id="@+id/price"
    android:layout_width="wrap_content"
    android:layout_height="18dp"
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentBottom="true"
    android:singleLine="true" />

<TextView
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="18dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:paddingRight="4dp"
    android:singleLine="true" />

<TextView
    android:id="@+id/title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="17dp"
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:paddingRight="4dp"
    android:layout_alignWithParentIfMissing="true"
    android:gravity="center" />

</RelativeLayout>

感谢您的时间

原文由 edzillion 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 518
2 个回答

这不是问题,绝对不能保证调用 getView() 的顺序,也不能保证调用多少次。在您的特定情况下,您通过给它一个 ListView 做最糟糕的事情 height=wrap_content 。这迫使 ListView 在布局时从适配器中测量出几个孩子,以了解它应该有多大。这就是提供 ListViewconvertViews 你看到传递给 getView() 甚至在你滚动之前。

原文由 Romain Guy 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试在列表视图的 match_parent layout_height 属性上使用 --- 。它将防止 getView() 被如此频繁地调用。

原文由 Fred T 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题