如何将ArrayAdapter <string>从Activity传递给Fragment </string>

时间:2015-04-14 15:57:50

标签: android android-fragments android-arrayadapter listadapter android-bundle

我有一个包含1个活动和3个碎片的应用。

在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();
    }
}

我想在我的第一个片段中使用该适配器 -

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并在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),但是得到了这个错误:

  

Bundle类型中的方法putParcelableArrayList(String,ArrayList)不适用于参数   (String,ArrayAdapter)

我不知道,我应该确定哪些quickfix建议:

Eclipse screenshot

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

1 个答案:

答案 0 :(得分:1)

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