1

У меня есть приложение с 1 активностью и 3 фрагментами.Как передать ArrayAdapter <String> от Activity to Fragment

В деятельности у меня есть адаптер, в котором будут храниться сообщения журнала -

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: предложение

Я попытался Exception Любителя (спасибо +1), но получаю эту ошибку:

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

И я не, конечно, какие из предложений QuickFix я должен принять:

Eclipse screenshot

Также интересно, почему не savedInstanceState могут быть использованы - д o Мне действительно нужно создать новый объект Bundle при передаче данных из Activity to Fragment?

+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

Спасибо, но я получаю сообщение об ошибке - ознакомьтесь с обновленным вопросом –