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

1 に答える 1

0

まず、アクティビティレイアウトの場合は、フラグメントをxmlに追加します。アクティビティonCreateで

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

これは、アクティビティの再作成時にフラグメントが再作成されないことを意味します。

onActivityCreatedでListViewを変更しないでください。向きが変わるたびに再構築されるためです。新しいアダプタを設定すると、子の状態がリセットされます。

ビューがすでに作成されているnullまたはブールフラグのチェックを追加します。次回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;
}
于 2013-02-12T15:34:17.363 に答える