在PagerAdapter上删除多个视图

时间:2014-08-21 16:41:41

标签: android android-viewpager android-adapter android-pageradapter

我一直在使用dynamically add and remove view to viewpager显示的适配器,但并非一切正常。

我的ViewPager包含一些带有webViews的自定义视图。我所做的是一个扩展类的PagerAdapter,它实现了与我第一次发布的答案中显示的几乎相同的方法。

当我删除尝试同时删除多个页面时出现问题。正如它在上面的答案中解释的那样,为了删除页面,我们将适配器设置为null,然后再次设置它。我使用它的方法几乎与只有一个页面相同,但删除了任何页面。

以下是我的代码。

public void removeView(int position){
    synchronized (mLock) {
        int readingPosition = pager.getCurrentItem();
        pager.setAdapter (null);
        mInView.remove(position);
        pager.setAdapter (this);
        if(mInView.size() > 0){
            if(readingPosition > position){
                pager.setCurrentItem(readingPosition-1);
            }else if(readingPosition < position){
                pager.setCurrentItem(readingPosition);
            }else if(readingPosition == position){
                pager.setCurrentItem(0);
            }
        }
    }               
}

public void removeViews (ArrayList<Integer> positions){
    synchronized (mLock) {
        int readingPosition = pager.getCurrentItem();
        Flyer readingFlyer = null;
        if(!positions.contains(readingPosition)){
            readingFlyer = mInView.get(readingPosition);
        }
        pager.setAdapter (null);
        for(int i = 0; i < positions.size(); i++){
            mInView.remove(positions.get(i));
        }
        pager.setAdapter (this);
        if(!positions.contains(readingPosition)){
            pager.setCurrentItem(mInView.indexOf(readingFlyer));
        }else if(mInView.size() > 0){
            pager.setCurrentItem(0);
        }
    }
}

如果它几乎一样,它为什么不工作?

我一直试图将notifyDataSetChanged()放在setAdapter(this)的上方和下方,但它没有用。

此外,我已尝试不再按Add / Delete pages to ViewPager dynamically显示的那样再次设置适配器,我认为只有拨打notifyDataSetChanged()才能正常工作,但它不会吨。

1 个答案:

答案 0 :(得分:0)

我终于解决了这个烦人的错误,改变了一点方法。

我发现当我打电话给.remove(positions.get(i))或只是.remove(positions.get(0))时,任何页面都被移除了,所以我认为问题在于.remove()的使用,然后我找到了{{3这不是同一个问题,而是告诉我另一种方法。

这是我的最终代码,也许对某人有用。

public void removeViews (final ArrayList<Integer> positions){
    synchronized (mLock) {
        int readingPosition = pager.getCurrentItem();
        Flyer readingFlyer = null;
        if(!positions.contains(readingPosition)){
            readingFlyer = mInView.get(readingPosition);
        }
        pager.setAdapter (null);
        List<Flyer> mToRemove = new ArrayList<Flyer>();
        for(int i = 0; i < positions.size(); i++){
            mToRemove.add(mInView.get(positions.get(i)));
        }
        mInView.removeAll(mToRemove);
        pager.setAdapter (this);
        if(!positions.contains(readingPosition)){
            pager.setCurrentItem(mInView.indexOf(readingFlyer));
        }else if(mInView.size() > 0){
            pager.setCurrentItem(0);
        }
    }
}