Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 适配器实例在listview的片段中消失_Java_Android_Android Fragments_Android Viewpager_Android Arrayadapter - Fatal编程技术网

Java 适配器实例在listview的片段中消失

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

我对碎片还很陌生,确实有个问题

My onResume()方法调用数据库帮助器类,该类将一些简单对象返回给以下侦听器方法:

    @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;