1

我有一個活動和3片段的應用程序。如何將ArrayAdapter <String>從活動傳遞到片段

在我有一個適配器,到了我存儲日誌信息的活動 -

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

不幸的是,這不起作用(應用程序崩潰)。

我也嘗試添加一個公共方法的片段,把它的活動 - 但是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 
    } 

請告訴我如何將我的適配器傳遞給碎片。

UPDATE:

我已經試過異常情人的建議(感謝+1),但出現此錯誤:

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

而我不是,肯定其中的quickfix建議我應該採取:

Eclipse screenshot

而且我在想,爲什麼不能savedInstanceState使用 - d o當從Activity到Fragment傳遞數據時,我真的需要創建一個新的Bundle對象嗎?

+1

你可以通過它在片段的構造函數,賦值給變量。 – Satty

回答

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

謝謝,但我在活動中遇到錯誤 - 請參閱更新後的問題 –