![](/img/trans.png)
[英]Android keep selected fragment state / loaded url after orientation change,
[英]Keep list fragment selected item position on orientation change
我在另一個片段的左側有一個列表片段,本質上是標准單擊一個項目並更新右側的片段模式。 當他們單擊列表片段中的一項時,他們正在選擇新聞類別,當他們旋轉設備時,我需要保留選中的內容。 我怎么做? 我當前的代碼不起作用。
我的代碼如下:
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);
}
}
}
首先,如果活動布局將片段添加到xml中。 在活動中onCreate
getFragmentManager().findFragmentById(R.id.youtfragmentid).setRetainInstance(true)
這意味着將不會在重新創建活動時重新創建片段。
不要在onActivityCreated中更改您的ListView-因為每次方向更改時都會重新構建它。 如果您設置新的適配器-子狀態將被重置。
添加檢查是否已創建視圖的null或boolean標志。 下次調用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.