gpt4 book ai didi

android - 如何将 ArrayAdapter 从 Activity 传递到 Fragment

转载 作者:行者123 更新时间:2023-11-30 02:14:14 26 4
gpt4 key购买 nike

我有一个包含 1 个 Activity 和 3 个 fragment 的应用。

在 Activity 中,我有一个适配器,我将日志消息存储到其中 -

MainActivity.java(用字符串保存适配器):

private ArrayAdapter<String> mLogListAdapter;

public void onCreate(Bundle savedInstanceState) {
.....
mLogListAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
android.R.id.text1);

if (savedInstanceState == null) {
MainFragment fragment = new MainFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("LOG", (Serializable) mLogListAdapter);
//bundle.putParcellable("LOG", (Parcellable) mLogListAdapter);
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}
}

我想在我的第一个 fragment 中使用那个适配器 -

MainFragment.java(应显示带有日志字符串的列表):

private ListView mLogList;

public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main, container, false);
.........
mLogList = (ListView) view.findViewById(R.id.logList);
mLogList.setChoiceMode(ListView.CHOICE_MODE_NONE);

// THIS DOES NOT WORK
ListAdapter adapter =
(ListAdapter) savedInstanceState.getSerializable("LOG");
mLogList.setAdapter(adapter);

return view;
}

不幸的是,这不起作用(应用程序崩溃)。

我也尝试过向 Fragment 添加一个公共(public)方法并在 Activity 中调用它 - 但随后 mLogList 为空并且我得到 NPE(因为 mLogList 已创建稍后 - 不是在构造函数中,而是在 onCreateView 方法中):

MainActivity.java:

    if (savedInstanceState == null) {
MainFragment fragment = new MainFragment();
fragment.setAdapter(mLogListAdapter);
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}

MainFragment.java:

    public void setAdapter(ListAdapter adapter) {
mLogList.setAdapter(adapter); // GIVES NPE
}

请告知如何将我的适配器传递给 fragment 。

更新:

我已经尝试过 Exception Lover 的建议(感谢 +1),但出现此错误:

The method putParcelableArrayList(String, ArrayList) in the type Bundle is not applicable for the arguments (String, ArrayAdapter)

我不确定我应该采纳哪些 quickfix 建议:

Eclipse screenshot

另外我想知道,为什么不能使用 savedInstanceState - 在将数据从 Activity 传递到 Fragment 时,我真的需要创建一个新的 Bundle 对象吗?

最佳答案

MainActivity.java(用字符串保存适配器)更改代码

private ArrayAdapter<String> mLogListAdapter;

public void onCreate(Bundle savedInstanceState) {
.....
mLogListAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
android.R.id.text1);

if (savedInstanceState == null) {
MainFragment fragment = new MainFragment();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("arraylist", data);
fragment.setArguments(bundle);
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}
}

还有改变

public View onCreateView(LayoutInflater inflater, 
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main, container, false);
.........
mLogList = (ListView) view.findViewById(R.id.logList);
Bundle extras = getArguments();
if (extras != null) {
data = extras.getParcelableArrayList("arraylist");
mLogList.setAdapter(new MyAdapter(getActivity(), data));
}
mLogList.setChoiceMode(ListView.CHOICE_MODE_NONE);


return view;
}

关于android - 如何将 ArrayAdapter<String> 从 Activity 传递到 Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29632028/

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