自定义的listview适配器getView方法被多次调用,并且没有连贯的顺序

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

class ResultsListAdapter extends ArrayAdapter<RecordItem> { 

在重写的“getView”方法,我做了一个打印来检查是什么位置是否是一个convertView或不是:

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

这个输出(当列表第一次显示时,没有用户input)

 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()只被称为可见的行。 由于我的应用程序从四个可见的行开始,至less从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> 

感谢您的时间

这不是问题, getView()将被调用的顺序,也不会有多less次。 在你的具体情况下,你正在做一个ListView的可能最糟糕的事情,给它一个height=wrap_content 。 这会强制ListView在布局时测量适配器中的几个子元素,知道它应该是多大。 这是什么提供的ListViewconvertViews你看到传递给getView()甚至在你滚动之前。

尝试在列表视图的layout_height属性上使用match_parent 。 它会阻止getView()被经常调用。

当我将layout_width和layout_height都改为match_parent时,我摆脱了这个问题(只改变了layout_height没有帮助)。


有帮助的注意事项 ,如果你有嵌套的项目。 你必须把“最高”的一个改为match_parent 。 希望它可以帮助别人。

我不能回答你的“为什么”的问题,但我绝对有一个解决恼人的“ ListView项目重复 ”问题的问题(如果你有在收集超过屏幕高度的项目)。

正如上面提到的许多人一样,将ListVew标签的android:layout_height属性保持为fill_parent

而关于getView()函数,解决scheme是使用一个名为ViewHolder静态类 。 看看这个例子。 它成功完成了在Array或ArrayCollection中添加所有项目的任务。

希望这可以帮助朋友!

最好的问候,Siddhant

问:为什么Adapter多次调用getView()? Ans:ListView在滚动时呈现的是刷新它的下一个即将到来的视图的视图,通过调用getView(),适配器需要获取视图。

问:如果listview的宽度和高度设置为fill_parent,为什么它的调用更less? Ans:因为充气机对于列表的屏幕区域具有固定大小,所以计算一次将视图渲染到屏幕上。

希望它能解决你的查询。

我在AutoCompleteTextView的下拉菜单中遇到同样的问题。 我一直在解决这个问题两天,直到我到达这里,然后向我展示解决scheme。

如果我写dropDownHeight =“match_parent”,问题就解决了。 现在问题与UI相关(当你有一个项目的下拉太大),但多个电话的问题(更重要的)是固定的。

谢谢!!

“为什么getview要求每行三次?” 因为当你在listview上滚动的时候调用getView,并且当你的列表视图的位置被改变的时候调用getView就会被调用!

我有同样的问题。 如果我有高度设置为fill_parent,那么我得到“通常”每行2个调用。 但是,如果我将ListView的高度设置为精确值,我们假设为300dp,那么每行只有一个GetView调用。

所以,在我看来,唯一的办法是先确定屏幕的高度,然后以编程方式将listvilew的高度设置为该值。 我不喜欢它。 我希望有更好的办法。

对于所有仍然(将ListViewheight设置为match_parent )仍然卡住(像我一样):

您还必须将父级布局的height设置为match_parent

看下面的例子。 LinearLayout是这里的父类:

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/something" /> <ListView android:id="@+id/friendsList" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>