gpt4 book ai didi

java - 适配器实例与 ListView 一起消失在 fragment 中

转载 作者:行者123 更新时间:2023-12-01 14:52:30 25 4
gpt4 key购买 nike

我对 Fragments 还很陌生,并且在 ATM 上确实遇到了问题。

我的 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 为 null,则它会被初始化。到目前为止效果很好。一旦配置发生变化(例如用户进入横向),我的问题就会出现。数据显示得很好(因为 onResume 和 onHistoryLoaded 也被调用得很好,并告诉适配器已为空,因此是新创建的)。但是,当我在适配器上调用 .clear() (在纵向模式下工作正常)时,我得到一个 nullpointerException,因为 mAdapter 变量实例为 null。怎么会发生这种事呢?我在后台线程或其他线程中什么也不做。此时它不应该为空。

我的想法已经用完了。提前致谢。

我的 LogCat 错误:

02-05 00:17:22.430: E/HistoryFragment(25174): mAdapter is null?
02-05 00:17:22.430: W/System.err(25174): java.lang.NullPointerException
02-05 00:17:22.445: W/System.err(25174): at com.sapps.savetodrive.HistoryFragment.cleanHistory(HistoryFragment.java:361)
02-05 00:17:22.445: W/System.err(25174): at com.sapps.savetodrive.MainActivity.onOptionsItemSelected(MainActivity.java:103)
02-05 00:17:22.445: W/System.err(25174): at android.app.Activity.onMenuItemSelected(Activity.java)
02-05 00:17:22.445: W/System.err(25174): at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:351)
02-05 00:17:22.445: W/System.err(25174): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java)
02-05 00:17:22.450: W/System.err(25174): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java)
02-05 00:17:22.455: W/System.err(25174): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java)
02-05 00:17:22.455: W/System.err(25174): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java)
02-05 00:17:22.455: W/System.err(25174): at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java)
02-05 00:17:22.475: W/System.err(25174): at com.android.internal.view.menu.ActionMenuPresenter$OverflowPopup.onItemClick(ActionMenuPresenter.java)
02-05 00:17:22.480: W/System.err(25174): at android.widget.AdapterView.performItemClick(AdapterView.java)
02-05 00:17:22.480: W/System.err(25174): at android.widget.AbsListView.performItemClick(AbsListView.java)
02-05 00:17:22.485: W/System.err(25174): at android.widget.ListView.performItemClick(ListView.java)
02-05 00:17:22.485: W/System.err(25174): at android.widget.AbsListView$PerformClick.run(AbsListView.java)
02-05 00:17:22.485: W/System.err(25174): at android.widget.AbsListView$1.run(AbsListView.java)
02-05 00:17:22.485: W/System.err(25174): at android.os.Handler.handleCallback(Handler.java)
02-05 00:17:22.490: W/System.err(25174): at android.os.Handler.dispatchMessage(Handler.java)
02-05 00:17:22.490: W/System.err(25174): at android.os.Looper.loop(Looper.java)
02-05 00:17:22.490: W/System.err(25174): at android.app.ActivityThread.main(ActivityThread.java)
02-05 00:17:22.490: W/System.err(25174): at java.lang.reflect.Method.invokeNative(Native Method)
02-05 00:17:22.490: W/System.err(25174): at java.lang.reflect.Method.invoke(Method.java)
02-05 00:17:22.490: W/System.err(25174): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
02-05 00:17:22.495: W/System.err(25174): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
02-05 00:17:22.495: W/System.err(25174): at dalvik.system.NativeStart.main(Native Method)

下面的代码是错误发生的地方(只是稍微重构一下,它发生在 mAdapter.clear() 处)。这将返回 mAdapter == null 为 TRUE!

    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 似乎实例化了自己的 fragment 对象实例。所以发生的事情是,我对 fragment 实例的 OnOptionsItemCerated() 调用(由 viewpager 检索)基本上是 fragment 的空实例,它没有调用 onAttach() onActivityCreated() 东西,因为它不是尚未附加任何 Activity 。所以我的“解决方法”(对于这个特别愚蠢的问题恕我直言)是使用这里建议的解决方案:getFragmentByTag from Switcher

它的作用基本上是在viewpager中“生成生成的标签”,以从fragmentmanager中检索当前显示(和附加)的 fragment 。

private String getFragmentTag(int pos){
return "android:switcher:"+R.id.pager+":"+pos;
}

所以我在 onOptionsItemSelected 中的解决方案最终看起来像这样:

    case R.id.menu_cleanhistory:
((HistoryFragment) MainActivity.this.getSupportFragmentManager()
.findFragmentByTag(
"android:switcher:" + R.id.viewpager + ":1"))
.cleanHistory();
return true;

不管你信不信——它确实有效。

关于java - 适配器实例与 ListView 一起消失在 fragment 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com