当android设备方向改变时删除了listview itmes

时间:2016-02-03 11:03:53

标签: java android listview fragment

我有一个带有一个片段的MainActivity。我在pager中有一个ListView,它位于MainActivity的片段内。现在,当设备方向改变时,ListView没有显示之前显示的任何项目:

MainFragment.java:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);

    if (myGrp == null)
                myGrp = new ArrayList<List<String>>();

    mActivityAdapter = new MyGroupsAdapter(myContext, myGrp);

    mSectionsPagerAdapter = new SectionsPagerAdapter(
                    myContext.getSupportFragmentManager());
            mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);

    mViewPager.setCurrentItem(1);
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

            public SectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }

            @Override
            public Fragment getItem(int position) {
                Fragment fragment = new DummySectionFragment();
                Bundle args = new Bundle();
                args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
                fragment.setArguments(args);
                return fragment;
            }

            @Override
            public int getCount() {
                // Show 3 total pages.
                return 3;
            }

            @Override
            public CharSequence getPageTitle(int position) {
                Locale l = Locale.getDefault();
                switch (position) {
                case 0:
                    return getString(R.string.title_section3).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section1).toUpperCase(l);
                }
                return null;
            }
        }

    public View onCreateView(LayoutInflater inflater,
                    final ViewGroup container, Bundle savedInstanceState) {
                View dummyView = null;
                if (getArguments().getInt(ARG_SECTION_NUMBER) == 1) {
                    dummyView = inflater.inflate(R.layout.inbox_fragment,
                            container, false);
                    ListView mListView = (ListView) dummyView
                            .findViewById(R.id.inbox_listview);
                    mListView.setAdapter(inboxAdapter);
                    mListView
                            .setOnItemLongClickListener(new OnItemLongClickListener() {

                                @Override
                                public boolean onItemLongClick(AdapterView<?> arg0,
                                        View arg1, int position, long id) {
                                    MainFragment fragment = new MainFragment();
                                    fragment.inboxItem_onLongClick(id);
                                    return false;
                                }
                            });
                } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 2) {
                    dummyView = inflater.inflate(R.layout.chat_fragment, container,
                            false);
                    ListView mListView = (ListView) dummyView
                            .findViewById(R.id.chatGroupList);
                    mListView.setAdapter(mActivityAdapter);
                } else if (getArguments().getInt(ARG_SECTION_NUMBER) == 3) {
                            //any things 
                      }
    }
}



@Override
    public void onResume() {
        super.onResume();
        SharedPreferences prfs = myContext.getSharedPreferences("user_info",
                Context.MODE_PRIVATE);
        GroupsSaved = prfs.getBoolean("GroupsSaved", false);

        if (myGrp == null || myGrp.size() == 0)
            getMyGroups();

        Global.nowChatGrpID = 0;
        mActivityAdapter.notifyDataSetChanged();
    }

3 个答案:

答案 0 :(得分:0)

替换此代码:

myContext.getSupportFragmentManager();

getChildFragmentManager();

这可行。

如果您想拥有一个充当片段容器的片段,则必须使用片段的getChildFragmentManager方法。如果您使用getSupportFragmentManager,您基本上将使用片段管理器,其行为与活动生命周期的方式相同,而不是片段的方式。

例如,我有一个包含ViewPager的片段 - 它被称为CollectionsFragment。所以我在其中显示了3个片段作为标签:AllCollectionsFragment,MyCollectionsFragment,FavouriteCollectionsFragment。我将getActivity().getSupportFragmentManager()提供给我正在使用的FragmentStatePagerAdapter。

因此,这会导致以下行为 - 不会调用3个选项卡片段的onDestroyView/onDestroy/onDetach/onStop方法。当我改为使用getChildFragmentManager时一切正常。

如果您需要,可以查看两种方法的文档:

  

getChildFragmentManager():

返回一个私有的FragmentManager,用于放置和管理此片段内的片段。

  

getSupportFragmentManager():

返回FragmentManager以与与此片段活动相关联的片段进行交互。

答案 1 :(得分:0)

当您更改方向时,可能会重新加载您的活动,尝试将其添加到您的清单中:

     <activity android:name=".yourActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize"
...

解决您的问题?

答案 2 :(得分:0)

为确保您的Activity不会在每次更改方向时重新加载,您应在清单中声明android:configChanges="keyboardHidden|orientation|screenSize"。这样可以确保“活动”的状态保留,并且在方向更改后不会重新加载。