我在 Stckoverflow 上阅读了很多问题和答案。但是仍然找不到我什么时候真正使用 adapter.notifyDataSetChanged
。
以前,在将所有项目添加到 ArrayList 之后,我做了
adapter = new ListViewAdapter(MainActivity.this, menuItems);
lv.setAdapter(适配器);
adapter.notifyDataSetChanged();
它在我的手机、模拟器上完全没有崩溃,只有少数人发生了崩溃。
然后,我做到了。
adapter = new ListViewAdapter(MainActivity.this, menuItems);
adapter.notifyDataSetChanged();
lv.setAdapter(适配器);
结果同上。
但我讨厌崩溃。我讨厌下载我的应用程序的人有 FC。 然后我尝试了这个,知道适配器可能需要刷新,然后我可以设置一个新的。
adapter.notifyDataSetChanged();
adapter = new ListViewAdapter(MainActivity.this, menuItems);
lv.setAdapter(适配器);
结果是,在向下滚动几页后 [永无止境的 ListView ],它在我的手机上崩溃了。
可能是我不明白。但是我们什么时候真正使用 adapter.notifyDataSetChanged
?
如果有帮助,这是我的完整代码。
`
private class firstLoad extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
setSupportProgressBarIndeterminateVisibility(true);
if (lv.getVisibility() == View.VISIBLE) {
lv.setVisibility(View.GONE);
}
}
protected Void doInBackground(Void... unused) {
try {
xml = parser.getXmlFromUrl(getURLFromXML + "main.php");
doc = parser.getDomElement(xml);
NodeList nl = doc.getElementsByTagName(Consts.KEY_ITEM);
for (int i = 0; i < nl.getLength(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
map.put(Consts.KEY_NAME,
parser.getValue(e, Consts.KEY_NAME));
map.put(Consts.KEY_DATE,
parser.getValue(e, Consts.KEY_DATE));
menuItems.add(map);
}
} catch (Exception e) {
Log.e(TAG, "Error loading first page", e);
}
return (null);
}
protected void onPostExecute(Void unused) {
setSupportProgressBarIndeterminateVisibility(false);
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
//adapter.notifyDataSetChanged();
adapter = new ListViewAdapter(MainActivity.this,
menuItems);
lv.setAdapter(adapter);
lv.setVisibility(View.VISIBLE);
loadingMore = false;
lv.setSelectionFromTop(0, 0);
lv.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view,
int scrollState) {
}
public void onScroll(AbsListView view,
int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
int lastInScreen = firstVisibleItem
+ visibleItemCount;
if ((lastInScreen == totalItemCount)
&& !(loadingMore)) {
new loadMoreListView().execute();
}
}
});
}
});
}
}`
提前致谢。
最佳答案
But when do we ACTUALLY use adapter.notifyDataSetChanged?
当您的数据发生变化时使用此方法。例如从您的 Array
或您的适配器获取数据的任何地方添加或删除项目。创建 Adapter
时,您不需要/不想调用它,因为数据尚未更改,会给您带来麻烦。因此,您只想在添加/删除/修改数据时调用它,并且您没有进行任何其他会重绘 ListView
关于android - ListView 自定义适配器 - 何时调用 notifyDataSetChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16503955/