Android 什么决定了getView()和#x27中的值范围;s位置参数?

Android 什么决定了getView()和#x27中的值范围;s位置参数?,android,Android,我的适配器的getView()例程发生崩溃,因为调用它时位置值为6,而我的数据源中只有6项。所以我假设位置参数应该在[0]-[5]的范围内?什么决定了getView()的位置参数中的值的范围 详细信息: XML <ListView android:id="@android:id/list" android:layout_height="match_parent" android:layout_width="match_parent" android:cacheColorHi

我的适配器的getView()例程发生崩溃,因为调用它时位置值为6,而我的数据源中只有6项。所以我假设位置参数应该在[0]-[5]的范围内?什么决定了getView()的位置参数中的值的范围

详细信息:

XML

<ListView
  android:id="@android:id/list"
  android:layout_height="match_parent"
  android:layout_width="match_parent"
  android:cacheColorHint="@color/colGrey"
  android:background="@color/colGrey"
  android:clickable="true"
  android:fastScrollEnabled="true"
  android:choiceMode="none"/>
。。。在onCreate()期间

创建适配器并绑定它

mylistadapter = new MyListAdapter(MyListActivity.this);
setListAdapter(mylistadapter);   // bind the adapter
…数据源是名为listItems的ArrayList。在运行程序的过程中,它的大小会发生变化,在程序执行过程中它可能已经提前了15分钟

public static ArrayList<String>listItems=new ArrayList<String>();
。。。在getView()中调用getCount()时,它返回6,这是数据源中的项数,但如果调用lv.getCount()则返回15。(知道这15是从哪里来的吗?)

所以我假设位置参数应该在[0]-[5]的范围内

什么决定了getView()的位置参数中的值的范围

它的范围从0到
getCount()
-1,其中
getCount()
适配器上实现

在运行程序的过程中,其大小会发生变化,并且在程序执行过程中可能早于15

如果更改数据,包括更改行数,则需要在
适配器上调用
notifyDataSetChanged()

所以我假设位置参数应该在[0]-[5]的范围内

什么决定了getView()的位置参数中的值的范围

它的范围从0到
getCount()
-1,其中
getCount()
适配器上实现

在运行程序的过程中,其大小会发生变化,并且在程序执行过程中可能早于15


如果更改数据,包括更改行数,则需要在
适配器上调用
notifyDataSetChanged()

lv.getView()
ListView没有
getView()
方法。你在这里指的是什么?。。。抱歉,lv.getCount(我已修复)
lv.getView()
ListView没有
getView()方法。你在这里指的是什么?。。。抱歉,lv.getCount(我已修复)我正在调用notifyDataSetChanged()。但我将其称为runnable(我认为这是一种规范上正确的方法)。有没有可能该线程在太晚之后才被执行,也就是说,在getView()已经被调用了6次之后?如果我坐在一个循环中更新我的数据集(上面的listItems),我如何告诉适配器在我完成之前不要调用getView()。@user316117:“但是我在runnable内部调用它(我认为这是一种规范上正确的方法)。”——不一定。需要在主应用程序线程上调用它。“有没有可能那个线程在太晚之后才被执行”--什么线程?“如果我坐在一个循环中更新我的数据集(上面的listItems),我如何告诉适配器在我完成之前不要调用getView()?--您必须在主应用程序线程上进行所有更改。在后台获取数据,但只更改
BaseAdapter
在主应用程序线程上的内容。@user316117:是。因此,在主应用程序线程上,更改
BaseAdapter
在其模型数据方面保留的内容,然后立即调用
notifyDataSetChanged()
。Android稍后将在主应用程序线程上调用
getCount()
以获取修改后的计数,此时
ListView
BaseAdapter
应该恢复同步。在本文中,他们建议RunnuiThread的可运行性,这样做有什么好处?@user316117:
RunnuiThread()
在主应用程序线程上运行提供的
Runnable
。从后台线程使用
runOnUiThread()
是一种非常好的方法,可以让
BaseAdapter
更新逻辑,包括在主应用程序线程上执行的
notifyDataSetChanged()
调用。我正在调用notifyDataSetChanged()。但我将其称为runnable(我认为这是一种规范上正确的方法)。有没有可能该线程在太晚之后才被执行,也就是说,在getView()已经被调用了6次之后?如果我坐在一个循环中更新我的数据集(上面的listItems),我如何告诉适配器在我完成之前不要调用getView()。@user316117:“但是我在runnable内部调用它(我认为这是一种规范上正确的方法)。”——不一定。需要在主应用程序线程上调用它。“有没有可能那个线程在太晚之后才被执行”--什么线程?“如果我坐在一个循环中更新我的数据集(上面的listItems),我如何告诉适配器在我完成之前不要调用getView()?--您必须在主应用程序线程上进行所有更改。在后台获取数据,但只更改
BaseAdapter
在主应用程序线程上的内容。@user316117:是。因此,在主应用程序线程上,更改
BaseAdapter
在其模型数据方面保留的内容,然后立即调用
notifyDataSetChanged()
。Android稍后将在主应用程序线程上调用
getCount()
以获取修改后的计数,此时
ListView
BaseAdapter
应该恢复同步。在本文中,他们建议RunnuiThread的可运行性,这样做有什么好处?@user316117:
RunnuiThread()
在主应用程序线程上运行提供的
Runnable
。从后台线程中使用
runOnUiThread()
是获得
BaseA的完美方法
mylistadapter = new MyListAdapter(MyListActivity.this);
setListAdapter(mylistadapter);   // bind the adapter
public static ArrayList<String>listItems=new ArrayList<String>();
@Override
public int getCount() {
    return listItems.size();
}