2013-02-12 6 views
2

У меня есть фрагмент списка слева от другого фрагмента и по существу является стандартным щелчком элемента и обновляется правильный фрагмент фрагмента. Когда они нажимают на элемент в фрагменте списка, они выбирают категорию статей новостей, и мне нужно сохранить все, что выбрано, когда они поворачивают устройство. Как мне это сделать? Мой текущий код не работает.Сохранение фрагмента выбранного фрагмента списка при изменении ориентации

Моего код выглядит следующим образом:

public class SideMenuFragment extends ListFragment { 
    ArrayList<SideItem> sideItems; 
    SideAdapter sideAdapter; 
    public SideMenuFragment() { 
     this.setRetainInstance(true); 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.list, null); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     sideItems = new ArrayList<SideItem>(); 
       ...add bunch of items 
     sideAdapter = new SideAdapter(getActivity(), sideItems); 
     getListView().setVerticalScrollBarEnabled(false); 
     setListAdapter(sideAdapter); 
     if (savedInstanceState != null) { 
      sideAdapter.setSelectedItem(savedInstanceState.getInt("sidePosition")); 
      sideAdapter.notifyDataSetChanged(); 
       } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("sidePosition", sideAdapter.getSelectedItem()); 
    } 

    @Override 
    public void onListItemClick(ListView lv, View v, int position, long id) { 
     if (sideAdapter.getSelectedItem() != position) { 
      sideAdapter.setSelectedItem(position); 
      sideAdapter.notifyDataSetChanged(); 
     } 
     switch (position) { 
         ...switch the fragment depending on position. 
        } 
    } 

    // the meat of switching the above fragment 
    private void switchFragment(Fragment fragment, String title) { 
     if (getActivity() == null) 
      return; 
     if (getActivity() instanceof HomeActivity) { 
      HomeActivity a = (HomeActivity) getActivity(); 
      a.switchContent(fragment, title); 
     } 
    } 
} 

ответ

0

Во-первыхи, добавить фрагмент в XML, если раскладка активности. В деятельности OnCreate

getFragmentManager().findFragmentById(R.id.youtfragmentid).setRetainInstance(true) 

Это означает, что фрагмент не будет воссоздан на активности воссоздавать.

Не изменяйте свой ListView в onActivityCreated - потому что он будет перестраиваться при каждом изменении ориентации. Если вы установите новый адаптер - состояния детей будут сброшены.

Добавьте проверку нулевого или булевского флага, что представление уже создано. В следующий раз onActivityCreated вызывается, список адаптер не должен изменять

if (sideAdapter == null) { 

    sideAdapter = new SideAdapter(getActivity(), sideItems); 
     getListView().setVerticalScrollBarEnabled(false); 
     setListAdapter(sideAdapter); 

} 

Кроме того, не создают новый вид в onCreateView использовать вместо ранее создан.

private View v; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (v == null) { 
     v = inflater.inflate(R.layout.list, null); 
    } else { 
     // detatch from container and return the same view 
     ((ViewGroup) getListView().getParent()).removeAllViews(); 
    } 
    return v; 
} 
+0

В настоящее время, попробовав некоторые из этих изменений, вскоре сообщит об этом. – egfconnor

+0

После добавления setRetainInstnace (true) и добавления нулевой проверки адаптера все отлично работает сейчас. Я тоже не изменил onCreateView. – egfconnor

+0

Oncreateview - это не связанная (но рекомендуемая) оптимизация. –

Смежные вопросы