![](/img/trans.png)
[英]Remove all fragments from ViewPager populated by FragmentStatePagerAdapter
[英]Dynamically remove an item from a ViewPager with FragmentStatePagerAdapter
關於這個主題有很多討論
我嘗試了各種解決方案(包括使用POSITION_NONE
失效)。 但我仍然不知道如何正確刪除項目。
會發生什么
instantiateItem
項目沒有被調用替換) arraylist/sparsearray
保存它們的方式arraylist/sparsearray
這是我的適配器
private class DatePickerPagerAdapter extends FragmentStatePagerAdapter {
ArrayList<Fragment> registeredFragments = new ArrayList<Fragment>();
public DatePickerPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return CreateWishFormDatePaginationFragment.newInstance(position);
}
@Override
public int getItemPosition(Object object){ //doesnt change much..
return PagerAdapter.POSITION_NONE;
}
@Override
public int getCount() {
return iPageCount;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.add(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, registeredFragments.get(position));
}
public void removePage(ViewGroup pager, int position) {
destroyItem(pager, position, null);
registeredFragments.remove(position);
iPageCount--;
pagerIndicator.notifyDataSetChanged();
pagerAdapter.notifyDataSetChanged();
}
public void addPage() {
iPageCount++;
pagerIndicator.notifyDataSetChanged();
pagerAdapter.notifyDataSetChanged();
}
}
我正在使用ViewPagerIndicator的視圖尋呼機,我希望能夠刪除其間的頁面,例如。
因此,問題是,在ViewPager中處理片段的添加和刪除的正確方法是什么?
謝謝!
如果要從ViewPager
刪除項目,以下代碼沒有意義:
@Override
public Fragment getItem(int position) {
return CreateWishFormDatePaginationFragment.newInstance(position);
}
基本上,您可以根據position
創建Fragment
。 無論您移除哪個頁面, position
范圍都會從[0, iPageCount
]更改為[0, iPageCount-1
) ,這意味着它將始終擺脫最后一個Fragment
。
您需要的是或多或少以下內容:
public class DatePickerPagerAdapter extends FragmentStatePagerAdapter
{
private ArrayList<Integer> pageIndexes;
public DatePickerPagerAdapter(FragmentManager fm) {
super(fm);
pageIndexes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
pageIndexes.add(new Integer(i));
}
}
@Override
public int getCount() {
return pageIndexes.size();
}
@Override
public Fragment getItem(int position) {
Integer index = pageIndexes.get(position);
return CreateWishFormDatePaginationFragment.newInstance(index.intValue());
}
// This is called when notifyDataSetChanged() is called
@Override
public int getItemPosition(Object object) {
// refresh all fragments when data set changed
return PagerAdapter.POSITION_NONE;
}
// Delete a page at a `position`
public void deletePage(int position)
{
// Remove the corresponding item in the data set
pageIndexes.remove(position);
// Notify the adapter that the data set is changed
notifyDataSetChanged();
}
}
有關從FragmentStatePagerAdapter中刪除項目的更多詳細信息,請參閱此完整示例 。
ViewPager不會使用上面的代碼刪除您的片段,因為它會將多個視圖(或您的案例中的片段)加載到內存中。 除了可見視圖外,它還將視圖加載到可見視圖的任一側。 這提供了從視圖到視圖的平滑滾動,使ViewPager非常酷。
要達到您想要的效果,您需要做一些事情。
覆蓋適配器方法getItemPosition(如下所示)。 當我們調用mAdapter.notifyDataSetChanged(); ViewPager詢問適配器以確定在定位方面發生了哪些變化。 我們使用此方法表示所有內容都已更改,因此重新處理所有視圖定位。 這是代碼......
private class MyPagerAdapter extends FragmentStatePagerAdapter { //... your existing code @Override public int getItemPosition(Object object){ return PagerAdapter.POSITION_NONE; } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.