Android 这个碎片膨胀了两次

Android 这个碎片膨胀了两次,android,android-listview,android-listfragment,Android,Android Listview,Android Listfragment,我有一个线性布局(layout\u container,在skeleton.xml中),在创建活动时,该布局使用ListFragment(menufragment)进行膨胀。然后,当用户执行单击时,此布局将替换为另一个ListFragment(albumsfragment) 问题是,当我按下“后退”按钮时,我确实会返回到菜单片段,但列表的长度是原来的两倍,因为列表中再次填充了相同的项目。我怎样才能避免这种情况 活动内部的OnCreate方法: /** Called when the ac

我有一个线性布局(
layout\u container
,在skeleton.xml中),在创建活动时,该布局使用ListFragment(
menufragment
)进行膨胀。然后,当用户执行单击时,此布局将替换为另一个ListFragment(
albumsfragment

问题是,当我按下“后退”按钮时,我确实会返回到菜单片段,但列表的长度是原来的两倍,因为列表中再次填充了相同的项目。我怎样才能避免这种情况

活动内部的OnCreate方法

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.skeleton);

        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();      
        MenuFragment menufragment = new MenuFragment();  
        fragmentTransaction.add(R.id.layout_container, menufragment, "menufragment");      
        fragmentTransaction.commit();

        }
  public void OnMenuClick() {

AlbumsFragment albumsfragment = new AlbumsFragment(); 
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.layout_container, albumsfragment, "albumsfragment");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

}
活动内部的OnClick方法

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.skeleton);

        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();      
        MenuFragment menufragment = new MenuFragment();  
        fragmentTransaction.add(R.id.layout_container, menufragment, "menufragment");      
        fragmentTransaction.commit();

        }
  public void OnMenuClick() {

AlbumsFragment albumsfragment = new AlbumsFragment(); 
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.layout_container, albumsfragment, "albumsfragment");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

}
我的片段类代码:

public class MenuFragment extends ListFragment{

ArrayList<MenuItem> m_parts = new ArrayList<MenuItem>();

     @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            MenuAdapter m_adapter;

            m_parts.add(new MenuItem ("item1"));
            m_parts.add(new MenuItem ("item2"));
            m_parts.add(new MenuItem ("item3"));
            m_parts.add(new MenuItem ("item4"));


            m_adapter = new MenuAdapter(getActivity(), R.layout.menu_row, m_parts);
            setListAdapter(m_adapter);
公共类MenuFragment扩展了ListFragment{
ArrayList m_parts=新的ArrayList();
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
菜单适配器m_适配器;
m_零件添加(新菜单项(“第1项”);
m_零件添加(新菜单项(“第2项”);
m_零件添加(新菜单项(“第3项”);
m_零件添加(新菜单项(“第4项”);
m_adapter=new MenuAdapter(getActivity(),R.layout.menu_行,m_部件);
setListAdapter(m_适配器);
所以每次我从AlbumFragment返回到MenuFragment,MenuFragment中的列表都会随着item1、item2、item3、item4的再次添加而增加

我尝试在MenuFragment的事务之前添加检查
if(savedInstanceState==null)
,但没有更改任何内容

我应该怎么做才能使MenuFragment从后堆栈中弹出,而不会再次被这些项目充气


谢谢。

请查看。
onActivityCreated()
每次返回
片段时都会被调用。请尝试将实现移动到
onCreate()
,这样可以解决重复问题。

请查看。
onActivityCreated())每次返回到
片段时都将调用
。请尝试将实现移动到
onCreate()
,这将解决重复问题。

在填充arraylist之前,您可能还可以检查arraylist的大小,然后在ActivityCreated()上清除它

     if(m_parts != null && m_parts.size()>0){

        //Clear the contents of the arrayList m_parts

          m_parts.clear();
       }

然后将数据添加到arrayList。

也许您还可以检查arrayList的大小,然后在填充arrayList之前在ActivityCreated()上清除它

     if(m_parts != null && m_parts.size()>0){

        //Clear the contents of the arrayList m_parts

          m_parts.clear();
       }

然后将数据添加到arrayList。

Wow,如果我在
onCreate()中填充arrayList,它确实可以工作
。谢谢!+1.嗯,我一直认为
onCreate
在片段中被
onActivityCreated
替换了…我想我需要再看一次生命周期图。谢谢,今天学到了一些新东西!哇,如果我在
onCreate()中填写我的数组列表,它确实有效
。谢谢!+1.嗯,我一直认为
onCreate
在片段中被
onActivityCreated
所取代…我想我需要再看一次生命周期图。谢谢,今天学到了一些新东西!
     if(m_parts != null && m_parts.size()>0){

        //Clear the contents of the arrayList m_parts

          m_parts.clear();
       }