Android: getView() 中的convertView 参数不为空,而它应该为空
Android: convertView parameter in getView() is not null when it should be null
我有一个带有自定义 ArrayAdapter 的 ListView,根据文档和我到处阅读的内容,在创建新视图(在本例中为列表项)或回收旧视图(convertView)时调用 getView(),或者至少我是这么理解的。
无论如何,在我的手机(注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>
第一次显示您的 ListView
时,它会多次调用 getView
以获取和测量适合屏幕的视图。
只有当您在滚动列表时一直看到 convertView: IS Null
时,您才应该担心。
类似的问题已经 answered quite a while ago by one of Google employees. I also strongly suggest watching a video about ListView performance。
我有一个带有自定义 ArrayAdapter 的 ListView,根据文档和我到处阅读的内容,在创建新视图(在本例中为列表项)或回收旧视图(convertView)时调用 getView(),或者至少我是这么理解的。
无论如何,在我的手机(注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>
第一次显示您的 ListView
时,它会多次调用 getView
以获取和测量适合屏幕的视图。
只有当您在滚动列表时一直看到 convertView: IS Null
时,您才应该担心。
类似的问题已经 answered quite a while ago by one of Google employees. I also strongly suggest watching a video about ListView performance。