0

我试图用另一个替换ViewPager中的片段之一。在ViewPager中替换片段

该寻呼机由两个页面组成:片段1,片段2 里面的片段2,有一个按钮。当我点击按钮时,它将用Fragment3替换当前片段Fragment2。对于Fragment2,我希望它被销毁,不再存在。

实现代码:

  • 布局activity_main:

    <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        android:background="?attr/colorPrimary" 
        app:layout_scrollFlags="scroll|enterAlways" 
        app:popupTheme="@style/AppTheme.PopupOverlay"> 
    
    </android.support.v7.widget.Toolbar> 
    
    <android.support.design.widget.TabLayout 
        android:id="@+id/tabs" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"/> 
    

  • main_activity:

    private SectionsPageAdapter mSectionsPageAdapter; 
    private ViewPager mViewPager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager()); 
    
    
        mViewPager = (ViewPager) findViewById(R.id.container); 
    
        setupViewPager(mViewPager); 
    
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
        tabLayout.setupWithViewPager(mViewPager); 
    
        mSectionsPageAdapter.clearAll();    
    
    
    } 
    
    private void setupViewPager(ViewPager viewPager) { 
        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager()); 
        adapter.addFragment(new Tab1Fragment(), "Tab 1"); 
        adapter.addFragment(new Tab2Fragment(), "Tab 2"); 
        adapter.notifyDataSetChanged() 
        viewPager.setAdapter(adapter); 
    } 
    
  • 适配器:

    public class SectionsPageAdapter extends FragmentPagerAdapter { 
    
        private final List<Fragment> mFragmentList = new ArrayList<>(); 
        private final List<String> mFragmentTitleList = new ArrayList<>(); 
    
        public void addFragment(Fragment fragment, String title) { 
         mFragmentList.add(fragment); 
         mFragmentTitleList.add(title); 
        } 
    
        public SectionsPageAdapter(FragmentManager fm) { 
         super(fm); 
        } 
    
        @Override 
        public CharSequence getPageTitle(int position) { 
         return mFragmentTitleList.get(position); 
        } 
    
        @Override 
        public Fragment getItem(int position) { 
         return mFragmentList.get(position); 
        } 
    
        @Override 
        public int getCount() { 
         return mFragmentList.size(); 
        } 
    
    
    } 
    
  • Fragment2:

    public class Tab2Fragment extends Fragment { 
        private static final String TAG = "Tab2Fragment"; 
    
        private Button btnTEST; 
    
        @Nullable 
        @Override 
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
         View view = inflater.inflate(R.layout.tab2_fragment,container,false); 
         btnTEST = (Button) view.findViewById(R.id.btnTEST2); 
    
         btnTEST.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
           Toast.makeText(getActivity(), "TESTING BUTTON CLICK 2", Toast.LENGTH_SHORT).show(); 
          } 
         }); 
    
         return view; 
        } 
    
    } 
    

更新:

我试图在适配器中实现clearAll方法,我注意到了mFragmentList()返回0为什么?

public void addFragment(Fragment fragment, String title) { 
    mFragmentList.add(fragment); 
    mFragmentTitleList.add(title); 
Log.d("tmz",mFragmentList.size()+" From addFragment"); // return 1 & 2 
} 


@Override 
public int getCount() { 
    return mFragmentList.size(); 
    Log.d("tmz",mFragmentList.size()+"getCount "); // return 2 

} 



public void clearAll(){ 
    Log.d("tmz",mFragmentList.size()+" From addFragment"); // return 0 why ? 
    for(int i=0; i<mFragmentList.size(); i++) 
    fragMan.beginTransaction().remove(mFragmentList.get(i)).commit(); 
    mFragmentList.clear(); 
    mFragmentList=new ArrayList<Fragment>(); 
    notifyDataSetChanged(); 
} 
+0

你在哪里调用clearAll标签内片段()? –

+0

此外,您的addFragment()方法需要在其末尾调用notifyDataSetChanged()以使添加生效。 –

+0

我对代码进行了修改,为了测试mFragmentList的大小,我将clearAll()放在了oncreate()中,但是在安装适配器之后将notifyDataSetChanged()放入之后,仍然给了我一个零。 –

回答

0

从mFragmentList(和mFragmentTitleList)中删除并添加新的,然后调用notifyDataSetChanged?也会在通知时添加到您的SectionsPageAdapter强制重绘ViewPager

public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

不是最有效的,但足以满足您的需要。对于适配器:

public void removeLastFragment() { 
    if(mFragmentList.size()==0) 
     return; 
    mFragmentList.remove(mFragmentList.size()-1); 
    mFragmentTitleList.remove(mFragmentTitleList.size()-1); 
} 
+0

感谢您的快速响应,但对我而言仍然不清楚,我可以将removeLastFragment放入onClick监听器中,并将getItemPosition放入适配器中。以及如果我有4个选项卡,并且我想用新的 –

+0

替换第三个片段,并且当我将removeLastFragment放入适配器时出现错误:“列表中的add(android.support.v4.app.Fragment)无法应用(int) –

+0

我的错误,应该[[删除]](https://developer.android.com/reference/java/util/ArrayList.html#remove(int)),而不是添加,明显地...如果你将有更多的选项卡,然后通过索引删除和添加片段的方法[add(int index,E元素)](https://developer.android.com/reference/java/util/ArrayList.html#add( int,%20E))。使用你的大脑,创建你的逻辑,我已经为你提供了所有需要的方法 – snachmsm

0

对于零,这是因为

SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager()); 

重复两次,我解决我的问题,使用替代