Android 什么决定了getView()和#x27中的值范围;s位置参数?
我的适配器的getView()例程发生崩溃,因为调用它时位置值为6,而我的数据源中只有6项。所以我假设位置参数应该在[0]-[5]的范围内?什么决定了getView()的位置参数中的值的范围 详细信息: XMLAndroid 什么决定了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
<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();
}