【发布时间】:2016-09-25 13:58:55
【问题描述】:
我在 Android 中使用 adapters,在极少数情况下,应用程序在为 ListView 设置数据时崩溃...请帮忙。
异常如下
java.lang.IllegalStateException: The content of the adapter has
changed but ListView did not receive a notification. Make sure the content of your
adapter is not modified from a background thread, but only from the UI thread.
Make sure your adapter calls notifyDataSetChanged() when its content changes.
[in ListView(2131558745, class android.widget.ListView)
with Adapter(class com.adapters.CustomToBeSyncAdapter)
这是我的代码 sn-p
private class ImportAsyncTask extends AsyncTask<Void, Integer, Integer> {
@Override
protected Integer doInBackground(Void... params) {
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
try {
RealmResults<AssetsActivitiesRealm> mResultsActivities = realm.where(AssetsActivitiesRealm.class).findAll();
for (int i = 0; i < mResultsActivities.size(); i++) {
AssetsActivitiesRealm mAssetsActivitiePj = mResultsActivities.get(i);
SyncPojoList.add(new SyncPojo(mAssetsActivitiePj.getBatch(), mAssetsActivitiePj.getItemCode()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
realm.close();
return 1;
}
@Override
protected void onPreExecute() {
showLoading();
}
@Override
protected void onPostExecute(Integer sum) {
try {
cancelLoading();
displayListView();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void notifyAdapter() {
getActivity().runOnUiThread(new Runnable() {
public void run() {
listViewSync.setAdapter(null);
if (mdataAdapter != null) {
mdataAdapter.notifyDataSetChanged();
listViewSync.requestLayout();
}
}
});
}
private void displayListView() {
mdataAdapter = new CustomToBeSyncAdapter(getActivity(),
R.layout.custom_tobesync_row, SyncPojoList);
notifyAdapter();
listViewSync.setAdapter(mdataAdapter);
listViewSync.invalidate();
}
【问题讨论】:
-
确保您的适配器在其内容更改时调用 notifyDataSetChanged() - 请尝试将
notifyDataSetChanged()应用于 ListView 以通知其背景更改。 -
是的,我已经调用了 notifyDataSetChanged(),但在极少数情况下它仍然崩溃.. 不知道如何修复这个错误
-
在崩溃发生时发布确切的Logcat和代码,使用hastebin.com
-
在此处添加了 logcat 跟踪 gist.github.com/anonymous/016cbc8481944cb93ae52d8ab18ce904
-
尝试
notifyitemchanged()和notifyItemInserted()似乎 ViewPager 在加载 ListView 之前正在捕获(更改 ListView)。
标签: java android listview android-adapter