我一直在使用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()
才能正常工作,但它不会吨。
答案 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);
}
}
}