Java 适配器实例在listview的片段中消失
我对碎片还很陌生,确实有个问题 My onResume()方法调用数据库帮助器类,该类将一些简单对象返回给以下侦听器方法:Java 适配器实例在listview的片段中消失,java,android,android-fragments,android-viewpager,android-arrayadapter,Java,Android,Android Fragments,Android Viewpager,Android Arrayadapter,我对碎片还很陌生,确实有个问题 My onResume()方法调用数据库帮助器类,该类将一些简单对象返回给以下侦听器方法: @Override public void onHistoryLoaded(List<Entry> entrieslist) { Logging.d(TAG, "onHistoryLoadedListener called"); if (entrieslist != null) { this.entries = entri
@Override
public void onHistoryLoaded(List<Entry> entrieslist) {
Logging.d(TAG, "onHistoryLoadedListener called");
if (entrieslist != null) {
this.entries = entrieslist;
if (mAdapter == null) {
Logging.d(TAG, "adapter is null, recreating");
this.mAdapter = new HistoryAdapter(getActivity(),
R.layout.history_row, entrieslist);
registerForContextMenu(lv);
mAdapter.setNotifyOnChange(true);
lv.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
} else {
mAdapter.clear();
mAdapter.addAll(entries);
mAdapter.notifyDataSetChanged();
}
} else {
Logging.e(TAG, "onHistoryLoaded: returned entries are empty");
}
}
下面的代码就是错误发生的地方(只是稍微重新构造一下,它发生在mAdapter.clear()。如果为真,则返回mAdapter==null
public void cleanHistory() {
if (mAdapter == null)
Logging.e(TAG, "ADAPTER IS NULL WHEN CLEANING?!");
else {
mAdapter.clear();
lastUndoAction = FLAG_UNDO_CLEANALL;
mUndoBarController.showUndoBar(false,
getString(R.string.item_allremoved), null);
}
}
继续
@Override
public void onResume() {
super.onResume();
if (lv != null && helper != null) {
Logging.d(TAG, "onResume(), lv and helper aren't null");
helper.getAllEntries();
// adapter.notifyDataSetChanged();
}
}
现在修好了。问题真的在别的地方。 Android似乎实例化了自己的片段对象实例。 所以发生的事情是,我对片段实例的OnOptionsItemCrated()调用,它由viewpager检索,基本上是片段的一个空实例,没有调用onAttach()onActivityCreated()东西,因为它还没有附加到任何活动。 所以我的“解决办法”(针对这个特别愚蠢的问题imho)是使用这里建议的解决方案: 它所做的基本上是在viewpager中“生成生成的标记”,从fragmentmanager中检索当前显示(和附加)的片段
private String getFragmentTag(int pos){
return "android:switcher:"+R.id.pager+":"+pos;
}
因此,我在OnOptions ItemSelected中的解决方案最终如下所示:
case R.id.menu_cleanhistory:
((HistoryFragment) MainActivity.this.getSupportFragmentManager()
.findFragmentByTag(
"android:switcher:" + R.id.viewpager + ":1"))
.cleanHistory();
return true;
信不信由你,它是有效的 简而言之,
mAdapter
在那里不能为空。请发布您的LogCat错误,这样我们就可以看到这个棘手的NPE实际发生的地方。这是。。。如果我检查mAdapter==null,它将返回true。您在哪里打印mAdapter is null?
?有趣的是,这些都是警告而不是错误。。。哪一行是361,是不是mAdapter.clear()
?是的。我在op的编辑中附加了一些源代码,其中mAdapter==null返回true。但只有在配置更改之后!当在横向或纵向模式下启动应用程序而不更改配置时,它会正常工作。您能否发布您的onResume()
方法,以便我们可以准确地查看方法调用的设置方式?
case R.id.menu_cleanhistory:
((HistoryFragment) MainActivity.this.getSupportFragmentManager()
.findFragmentByTag(
"android:switcher:" + R.id.viewpager + ":1"))
.cleanHistory();
return true;