保持对方向的改变列表片段选定的项目位置 [英] Keep list fragment selected item position on orientation change

查看:136
本文介绍了保持对方向的改变列表片段选定的项目位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有另一个片段上的左列表片段和本质上是标准单击一个项目,并更新权利片段的图案。当他们点击他们选择的新闻文章类别列表片段的项目,我需要保持被选中不管一个人,当他们旋转设备。我怎么做?我现在的code不起作用。

我的code是如下:

 公共类SideMenuFragment扩展ListFragment {
    ArrayList的< SideItem> sideItems;
    SideAdapter sideAdapter;
    公共SideMenuFragment(){
        this.setRetainInstance(真);
    }
    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
            捆绑savedInstanceState){
        返回inflater.inflate(R.layout.list,NULL);
    }    @覆盖
    公共无效onActivityCreated(捆绑savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        sideItems =新的ArrayList< SideItem>();
                ......添加一堆物品
        sideAdapter =新SideAdapter(getActivity(),sideItems);
        getListView()setVerticalScrollBarEnabled(假)。
        setListAdapter(sideAdapter);
        如果(savedInstanceState!= NULL){
            sideAdapter.setSelectedItem(savedInstanceState.getInt(sidePosition));
            sideAdapter.notifyDataSetChanged();
                }
    }    @覆盖
    公共无效的onSaveInstanceState(捆绑outState){
        super.onSaveInstanceState(outState);
        outState.putInt(sidePosition,sideAdapter.getSelectedItem());
    }    @覆盖
    公共无效onListItemClick(LV的ListView,视图V,INT位置,长的id){
        如果(sideAdapter.getSelectedItem()!=位置){
            sideAdapter.setSelectedItem(位置);
            sideAdapter.notifyDataSetChanged();
        }
        开关(位置){
                      ...切换,这取决于位置的片段。
                    }
    }    //切换上述片段肉
    私人无效switchFragment(片段片段,字符串名称){
        如果(getActivity()== NULL)
            返回;
        如果(getActivity()的instanceof HomeActivity){
            HomeActivity一个=(HomeActivity)getActivity();
            a.switchContent(片段,标题);
        }
    }
}


解决方案

首先,如果活动布局添加片段XML。
在活动的onCreate

  getFragmentManager()。findFragmentById(R.id.youtfragmentid).setRetainInstance(真)

这意味着该片段不会在活动重新创建被重新创建。

不要改变你的ListView在onActivityCreated - 因为它将每次方向变化进行重建。如果您设置一个新的适配器 - 孩子们的状态会先复位

添加检查空或视图已创建一个布尔标志。
下一次onActivityCreated被调用,您的列表适配器不应该改变。

 如果(sideAdapter == NULL){    sideAdapter =新SideAdapter(getActivity(),sideItems);
        getListView()setVerticalScrollBarEnabled(假)。
        setListAdapter(sideAdapter);}

另外,不要创建新的视图onCreateView改用previously创建的。

 私人视图V;@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
        捆绑savedInstanceState){
    如果(V == NULL){
        V = inflater.inflate(R.layout.list,NULL);
    }其他{
        //从容器detatch并返回相同的看法
        ((的ViewGroup)getListView()的getParent())removeAllViews();
    }
    返回伏;
}

I have a list fragment on the left of another fragment and is essentially the standard click an item and update the right fragment pattern. When they click an item in the list fragment they are choosing the news article category and I need to keep whatever one is selected when they rotate the device. How do I do that? My current code doesn't work.

My code is as follows:

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

解决方案

First, add your Fragment in xml if the Activity layout. In Activity onCreate

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

This means that the fragment will not be recreated on activity recreate.

Don't change your ListView in onActivityCreated - because it will be rebuilt every time orientation changes. If you set a new adapter - the states of children will be reseted.

Add checking for null or a boolean flag that the view already was created. Next time onActivityCreated gets called, your list adapter should not change

if (sideAdapter == null) {

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

}

Also, don't create new view in onCreateView instead use previously created one.

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

这篇关于保持对方向的改变列表片段选定的项目位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆