自定义列表视图适配器getView方法被调用多次,并没有一致的顺序 [英] custom listview adapter getView method being called multiple times, and in no coherent order
问题描述
我有一个自定义列表适配器:
I have a custom list adapter:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
在重写getView的方法我做一个打印检查什么位置以及它是否是一个convertView与否:
in the overridden 'getView' method I do a print to check what position is and whether it is a convertView or not:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
的这个输出(被首先显示的列表时,没有用户输入尚未)
The output of this (when the list is first displayed, no user input as yet)
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个循环的位置编号是有道理的。但其余的是一个烂摊子:
AFAIK, though I couldn't find it stated explicitly, getView() is only called for visible rows. Since my app starts with four visible rows at least the position numbers cycling from 0-3 makes sense. But the rest is a mess:
- 为什么getview要求各行三次?
- 在哪里这些convertViews从什么时候我还没有滚动尚未到来?
我做了一些研制的,并没有得到一个很好的答案,我也注意到,人与布局问题相关联的这一问题。所以,如果,这里是一个包含列表的布局:
I did a bit of reseach, and without getting a good answer, I did notice that people were associating this issue with layout issues. So in case, here's the layout that contains the list:
<?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>
感谢您的时间
推荐答案
这是不是一个问题,是绝对没有保证的顺序在其中 getView()
将被称为也不会有多少次。在特定的情况下,你正在做的最糟糕的事情可能与的ListView
给它一个高度= WRAP_CONTENT
。这将迫使的ListView
来衡量几个孩子了,在布局过程中的适配器,要知道它应该多大。这是提供的ListView
与 convertViews
你看到传递给 getView()$您滚动甚至在C $ C>。
This is not an issue, there is absolutely no guarantee on the order in which getView()
will be called nor how many times. In your particular case you are doing the worst thing possible with a ListView
by giving it a height=wrap_content
. This forces ListView
to measure a few children out of the adapter at layout time, to know how big it should be. This is what provides ListView
with the convertViews
you see passed to getView()
even before you scroll.
这篇关于自定义列表视图适配器getView方法被调用多次,并没有一致的顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!