当前位置: 首页 > 知识库问答 >
问题:

删除PagerAdapter上的多个视图

翟鸿振
2023-03-14

我一直在使用在动态添加和删除视图到viewpager中显示的适配器,但并不是所有的都能正常工作。

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

当我同时删除多个页面时,问题就来了。正如上面的答案中所解释的,对于删除页面,我们将适配器设置为空,然后再次设置。我使用的方法几乎与只使用一个页面相同,但任何一个页面都被移除。

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);
        }
    }
}

此外,我已经尝试不再设置适配器,因为它在Add/Delete pages to ViewPager Dynamics中显示,我认为只调用NotifyDataSetChanged()应该可以工作,但它不行。

共有1个答案

井翰
2023-03-14

我终于解决了这个恼人的错误更改了一点方法。

我发现当我调用.remove(positions.get(I))或简单地调用.remove(positions.get(0))时,任何页面都被删除了,因此我认为问题出在使用.remove()上,然后我发现为什么ArrayList.remove不起作用,这不是同一个问题,但给出了另一种方法来解决这个问题。

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

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);
        }
    }
}
 类似资料:
  • 我已经搜索了多个网站,android开发者网站,在没有运气解决我的问题后,我不得不寻求社区帮助。我们将非常感谢所有的帮助和建议。 问题: 我总共有12个从服务器接收的图像(在这里解析),我在一个PagerAdapter中显示了它们中的每一个。如果所有的值都不为空,适配器代码工作正常,问题是我允许空值存储在服务器中。当我从服务器获得整个列表时,我只想在包含not null的适配器中拥有这些视图。例如

  • 有没有办法防止用户在PagerAdapter中向左滑动? 当用户第一次进入应用程序时,他们不能向左滑动,因为那里没有任何东西。那么,如果每次你向右滑动时,左边的图像都被破坏了,并且没有什么会像你最初运行应用程序时那样。

  • 问题内容: 有没有更好的办法重写: 我无法使用, 因为它会删除所有我不想要的类。 问题答案: 从,类参数: 要从元素中删除的一个或多个CSS类,这些类之间用空格隔开。

  • 主要内容:基本语法,删除视图删除视图是指删除 MySQL 数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。 基本语法 可以使用 DROP VIEW 语句来删除视图。 语法格式如下: DROP VIEW <视图名1> [ , <视图名2> …] 其中: 指定要删除的视图名。DROP VIEW 语句可以一次删除多个视图,但是必须在每个视图上拥有 DROP 权限。 删除视图 【实例】删除 v_students_

  • 接口说明 删除视角 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/viewpoint/1.0.0/del 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 id string form 是 视角ID 响应字段说明 无 响应成功示例 { "code": 200, "data": "", "m

  • 通过该接口可以删除指定视频的信息,地址为: http://spark.bokecc.com/api/video/delete 需要传递以下参数: 参数 说明 videoid 视频id,不可为空 userid 用户id,不可为空 format 返回格式,xml 或json XML格式的返回信息如下: <?xmlversion="1.0"encoding="UTF-8"?> <result>OK</