自定义的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
在布局时测量适配器中的几个子元素,知道它应该是多大。 这是什么提供的ListView
与convertViews
你看到传递给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的高度设置为该值。 我不喜欢它。 我希望有更好的办法。
对于所有仍然(将ListView
的height
设置为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>