Stckoverflow でたくさんの質問と回答を読んできました。しかし、実際にいつ使用するのかはまだわかりませんadapter.notifyDataSetChanged
。
以前は、すべてのアイテムを ArrayList に追加した後、
adapter = new ListViewAdapter(MainActivity.this, menuItems);
lv.setAdapter(adapter);
adapter.notifyDataSetChanged();
私の電話、エミュレーターではまったくクラッシュしませんでした。このクラッシュが発生したのはごく少数でした。
それから、私はしました。
adapter = new ListViewAdapter(MainActivity.this, menuItems);
adapter.notifyDataSetChanged();
lv.setAdapter(adapter);
上記と同じ結果です。
でもクラッシュは嫌い。私のアプリをダウンロードする人が FC を持っているのが嫌いです。そして、おそらくアダプターを更新する必要があることを知って、これを試しました。その後、新しいアダプターを設定できます。
adapter.notifyDataSetChanged();
adapter = new ListViewAdapter(MainActivity.this, menuItems);
lv.setAdapter(adapter);
その結果、いくつかのページを下にスクロールした後 [終わりのないリストビュー]、私の電話でクラッシュします。
わからないのは私かもしれません。しかし、実際にいつ使用するの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();
}
}
});
}
});
}
}`
前もって感謝します。