【问题标题】:Android: convertView parameter in getView() is not null when it should be nullAndroid:getView()中的convertView参数应该为null时不为null
【发布时间】:2015-01-21 17:46:01
【问题描述】:

我有一个带有自定义 ArrayAdapter 的 ListView,根据文档和我到处阅读的内容,getView() 在创建新视图(在本例中为列表项)或回收旧视图(convertView)时被调用,或者至少这是我的理解。

无论如何,在我的手机(Note 3 Kitkat)上,我有一个 listView 最多可以在加载模式下预览(日志在下面)3个列表项(视觉上是2.2项),当然我可以向上/向下滚动到显示完整的 2 项 + 其他 2 项的 0.2 项(这意味着我的 listView 最多将预览 4 个列表项)。

当我设置有日志时,getView() 被调用了 6 次,第一次 convertView 为 NULL,然后 3 次是“NOT null”,然后是 2 次“Is Null”。

01-21 20:11:22.758  11517-11517/www.test.ar D//*/*/ convertView﹕ IS Null - Position is: 0
01-21 20:11:22.903  11517-11517/www.test.ar D//*/*/ convertView﹕ Not Null - Position is: 1
01-21 20:11:22.913  11517-11517/www.test.ar D//*/*/ convertView﹕ Not Null - Position is: 2
01-21 20:11:22.943  11517-11517/www.test.ar D//*/*/ convertView﹕ Not Null - Position is: 0
01-21 20:11:22.963  11517-11517/www.test.ar D//*/*/ convertView﹕ IS Null - Position is: 1
01-21 20:11:23.028  11517-11517/www.test.ar D//*/*/ convertView﹕ IS Null - Position is: 2

那么,只要没有向下/向上滚动,换句话说,只要没有超出屏幕范围的视图,convertView 就不应该为 NULL 吗?!

在我的这种情况下,ArrayAdapter 在第一次加载时应该创建多少项,3 项还是 4 项?

我使用的代码:

public class MyListArrayAdapter extends ArrayAdapter<String>
{
    public MyListArrayAdapter (Context context, String[] aTitles,  String[] aImagesURL)
{
        super(context, R.layout.list_item, aTitles);
}

   @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
       if(convertView == null)
        {
            Log.d("/*/*/ convertView", "IS Null - Position is: " + position);

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_item, parent, false);
        }
        else
        {
            Log.d("/*/*/ convertView", "Not Null - Position is: " + position);
        }
    }
}

list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="200dp"
    android:orientation="horizontal" >

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background_with_shadow">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true">

    <!-- title -->
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="8dp"
        android:textSize="18sp"
        android:maxLength="50"
        android:maxLines="1"
        android:text="Default Text"/>


    <!-- icon -->
    <ImageView
        android:id="@+id/icon"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:layout_below="@+id/title"
        android:src="@drawable/default_pic"/>

        </RelativeLayout>

</RelativeLayout>

</FrameLayout>

background_with_shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item >
        <shape
            android:shape="rectangle">
            <solid android:color="#DCDCDC" />
            <corners android:radius="2dp"/>
        </shape>
    </item>

    <item android:right="0.5dp" android:left="0.5dp" android:top="0.0dp" android:bottom="1.0dp">
        <shape
            android:shape="rectangle">

            <corners android:radius="2dp"/>
            <padding android:left="7dp" android:right="7dp" android:top="7dp" android:bottom="7dp" />
            <solid android:color="#FFFFFF" />
        </shape>
    </item>

</layer-list>

【问题讨论】:

  • 你说的这段代码在哪里?
  • @JaredBurrows 请重新检查问题,我添加了代码,谢谢。
  • 添加您的 list_item.xml
  • 检查(记录)position 参数和convertView 以更好地了解正在发生的事情。可能是ListView 是预缓存视图,然后在布局时刷新它们,等等。
  • @user3249477 完成,添加 list_item.xml 文件

标签: android listview android-listview


【解决方案1】:

第一次显示您的ListView 时,它将多次调用getView 以获取和测量适合屏幕的视图。

只有在滚动列表时不断看到convertView: IS Null 时,您才应该担心。

很久以前,一位 Google 员工提出了类似的问题answered。我也强烈建议观看video about ListView performance

【讨论】:

  • 谢谢,但是如果我想设置 convertView 的标签来保持位置(我将使用 AsyncTask 下载图像并将它们设置到相关列表项),我做它在(==null)还是在(!=null)? .... 我正在使用 position 设置 covertView 标记,因此我可以将 AsyncTask 对象持有的位置与相关视图的当前位置进行比较。
  • @Astrount 它应该在getView 中调用。在 (==null) 内部,您膨胀并设置标签。在 (!=null) 内部,您将获得标签和元素。在你做每一项工作的所有事情之外(和之后),例如获取和设置图像。
  • 再次感谢您:) 我将 ListView layout_height 修改为“fill_parent”而不是“match_parent”(根据您提供的第一个链接),并且在我的问题中重复调用 getView 消失了,现在它被 convertView 调用,正如我所期望的那样 [null, null, null] 并且只调用了 3 次。
猜你喜欢
  • 1970-01-01
  • 2023-02-17
  • 2022-01-19
  • 1970-01-01
  • 2011-12-23
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多