Android viewpager:添加/删除页面时出现奇怪的错误

2024-04-29

我不知道如何解释,所以我上传了一个视频Youtube. http://www.youtube.com/watch?v=o5sn31IX-Gc当我添加页面时一切正常。如果我从列表末尾开始并逐渐移至第一页,则删除页面也有效,但如果我删除 0 端之间的某个位置并在此之后添加页面,我将得到一个空白页面。片段已创建,但视图未创建。

我的代码有问题吗?是的,我见过this https://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view问题,返回POSITION_NONE不是一个选项,因为我正在开发的应用程序从网络下载内容并将其显示在列表视图中,因此每次用户删除页面时重新创建片段并不是很有效。

Button click:            Result:

Add page                 [Fragment 1]
Add page                 [Fragment 1][Fragment 2]
Add page                 [Fragment 1][Fragment 2][Fragment 3]
remove page(position2)   [Fragment 1][Fragment 2]
remove page(position1)   [Fragment 1]
Add page                 [Fragment 1][Fragment 2]
remove page(position1)   [Fragment 1]
remove page(position0)    ---No pages---


Add page                 [Fragment 0]
Add page                 [Fragment 0][Fragment 1]
Add page                 [Fragment 0][Fragment 1][Fragment 2]
add page                 [Fragment 0][Fragment 1][Fragment 2][fragment 3]
remove page(position2)   [Fragment 0][Fragment 1][Fragment 3]
add page                 [Fragment 0][Fragment 1][Fragment 3][Blank page]
remove page(position0)   [Fragment 1][Fragment 3][Fragment 3][Blank page]

MainActivity.class

    public class MainActivity extends FragmentActivity {
    private static final String TAG = "MainActivity";
    private ViewPager mViewpager;
    private ArrayList<Fragment> fragmentslist;
    private SectionsPagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragmentslist = new ArrayList<Fragment>();
        mPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        mViewpager = (ViewPager)findViewById(R.id.pager);
        mViewpager.setAdapter(mPagerAdapter);
        mViewpager.setOffscreenPageLimit(4);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected (MenuItem item){
        switch(item.getItemId()){
        case R.id.menu_add_page:
            Bundle bundle = new Bundle();
            bundle.putInt("Position", fragmentslist.size());
            fragment frag = new fragment();
            frag.setArguments(bundle);
            fragmentslist.add(frag);
            mPagerAdapter.notifyDataSetChanged();
            mViewpager.setCurrentItem(fragmentslist.indexOf(frag));
            Log.i(TAG, "Add fragment");
            break;
        case R.id.menu_remove_page:
            if(fragmentslist.size() > 0){
                mPagerAdapter.removeItem(mViewpager.getCurrentItem());
            }
            Log.i(TAG, "Removing page " + mViewpager.getCurrentItem());
            break;
        }
        return true;
    }


    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentslist.get(position);
        }

        @Override
        public int getCount() {
            return fragmentslist.size();
        }

        @Override
        public int getItemPosition(Object object){
            int index = fragmentslist.indexOf(object);
            if(index != -1){
                Log.i(TAG, "Position: " + index);
                return index;
            }
            else{
                Log.i(TAG, "POSITION_NONE");
                return POSITION_NONE;
            }
        }

        public void removeItem(int position){
            Fragment fragment = (Fragment)fragmentslist.get(position);
            getSupportFragmentManager().beginTransaction().remove(fragment).commit();
            fragmentslist.remove(position);
            notifyDataSetChanged();
        }

    }


    public static class fragment extends Fragment{
        private String colors[] = {"#FF0000", "#00FF00", "#FFFF00", "#FF6600"};

        public View onCreateView(LayoutInflater inflater, ViewGroup root, Bundle savedInstanceState){
            View mView = inflater.inflate(R.layout.fragment_layout, null);
            RelativeLayout layout = (RelativeLayout)mView.findViewById(R.id.relativelayout);
            TextView text = (TextView)mView.findViewById(R.id.textView1);

            int position = this.getArguments().getInt("Position");
            text.setText("Page: " + position);
            layout.setBackgroundColor(Color.parseColor(colors[position]));
            Log.i("fragment", "Page: " + position + " view created");
            return mView;
        }
    }

}

活动_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

片段布局.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" 
android:id="@+id/relativelayout">

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="Large Text"
    android:textSize="40sp" />

在从列表中添加或删除项目之前尝试执行 mViewpager.setAdapter(null) 。然后,将适配器设置回 mPagerAdapter。看来 ViewPager 的设计目的不是处理列表末尾以外的插入或删除操作。

我有工作示例代码,可能对您有用。看一眼ViewPager 示例 https://stackoverflow.com/questions/13664155/dynamically-add-and-remove-view-to-viewpager.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android viewpager:添加/删除页面时出现奇怪的错误 的相关文章

  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 如何在android中的谷歌地图上聚焦标记

    我只是想知道我们是否可以关注 Android 应用程序中添加的标记 如果是 怎么办 或者有没有其他方法可以完成这项任务 可以说我使用下面的代码添加了一个标记 map addMarker new MarkerOptions title tit
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 如何在Android模拟器中隐藏应用程序图标?

    我有一个应用程序在启动完成后自动启动 但应用程序图标显示在android模拟器中 现在我想向用户隐藏该图标 这样用户就无法知道应用程序已启动 并且他们无法启动该应用程序手动申请 在您的 AndroidManifest xml 文件中 您可能
  • 双屏 Android Studio 中不显示自动补全

    我刚刚从 Eclipse 切换到 Android Studio IntelliJ 我不明白自动补全是如何工作的 我尝试了 Control Space Control Shift Space 但没有相关建议 不在 Java 文件中 也不在布局
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • Android 的 Intent 和 Parcelable 对象

    为什么我需要打包我的对象 即使我只需将其发送到同一任务的另一个线程 实际上 我需要打开一个甚至可以在同一线程 主线程 上运行的活动 换句话说 为什么 Google 不提供一个 startActivity 版本 它采用通用对象广告参数而不是捆
  • TextView.setMaxLines 不起作用?

    在我的应用程序中 我有一个屏幕 其中显示一些文本 然后显示一张照片 文本的长度是可变的 有时根本没有 有时很多 所以我想对其进行设置 以便文本永远不会占用超过几行 但可以滚动 为下面的图像留下足够的空间 我这部分的视图组件是以编程方式创建的
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • TabLayout 的不同 tabMode

    我正在使用 ViewPager 和 TabLayout 如果选项卡可以放置在显示 tabMode 上 则它们必须是 app tabMode fixed else app tabMode scrollable 我怎样才能做到这一点 我不明白你
  • 在数组列表中过滤 Filterable 不取消之前的过滤

    我看过过滤器方法文档 其中显示调用过滤器会取消所有先前未执行的过滤请求 并发布一个稍后将执行的新过滤请求 但我收到的实际回调有些不同 在我的实现中 它不会取消先前的过滤器请求并调用publishResults 最近一次搜索条件后的上一次搜索
  • 如何正确处理 ListView 内的 Android EditText 输入?

    在我的应用程序中 我有一个在 a 中添加 删除 编辑记录的活动SortedMap 该活动作为以下活动的延伸实施ListActivity 我已经实现了自定义ArrayAdapter对于收藏品 Every ListView项目 对应于基础记录
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • Android 的代码覆盖率[重复]

    这个问题在这里已经有答案了 可能的重复 Android测试代码覆盖率 Eclipse https stackoverflow com questions 3282702 android test code coverage eclipse
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯

随机推荐

  • 了解 JAXB @XmlRootElement 注释

    我正在使用教程在这里 http www vogella com articles JAXB article html jaxb用于理解 JAXB 当作者开始创建文档的根时 作者开始如下 This statement means that c
  • 在rails生产环境中禁用服务器端缓存

    我即将部署一个包含敏感数据的应用程序 因此 不应将任何数据存储到磁盘上 有没有办法禁用服务器端缓存 我找不到任何 我碰巧遇到了这个问题 并且假设您不再需要答案 但是 我相信您正在寻找的是以下内容 config action controll
  • 在javascript中将字符串转换为数字

    我想解析包含经度和纬度的用户输入 我想做的是将字符串强制转换为数字 保留其符号和小数位 但我想做的是当用户输入无效时显示一条消息 我应该遵循哪一个 parseFloat x second new Number x third x fourt
  • 我的 ViewModel 列表中每个项目的数据验证

    要使用正则表达式进行验证 我通常这样做 In my ViewModel RegularExpression MyRegex ErrorMessageResourceName MyErrorMessage public string MyFi
  • 写入 BigQuery 时处理卡住

    我正在使用云数据流将数据从 Pub Sub 消息导入到 BigQuery 表 我正在使用 DynamicDestinations 因为这些消息可以放入不同的表中 我最近注意到该进程开始消耗所有资源 并且消息表明该进程被卡住开始显示 Proc
  • Python 词干分析器问题:词干错误

    你好 我正在尝试用 python 词干分析器来词干 我尝试了 Porter 和 Lancaster 但他们也有同样的问题 他们无法正确阻止以 er 或 e 结尾的单词 例如 它们源于 computer gt comput rotate gt
  • Knockout 将 css 类绑定到观察到的模型属性

    我想将 divs css 类绑定到视图模型的属性 如下所示 div 但这会产生结果 div class 0 1 2 3 这是视图模型 myViewModel selectedPriority ko observable High Compa
  • 什么时候调用CloseHandle?

    我有一个主线程 它接收需要一些时间的操作 所以我创建一个线程并将工作委托给它 当主线程接收作业时 将调用此执行函数 每个作业都执行此执行 Return type execute Arguments here if a file read c
  • Google Chrome 的互联网历史记录脚本

    我并不是在寻找 最佳 或最有效的脚本来执行此操作 但我想知道是否存在一个脚本可以从 Google Chrome 中提取一天的互联网历史记录并将其记录到 txt 文件中 我更喜欢用 Python 或 MATLAB 编写 如果你们有不同的方法
  • mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,布尔值给出

    看来我的 mysqli query 不起作用 我该怎么办 在密码附近的查询中使用 AND 而不是逗号 这就是查询返回 false 并抛出该错误的原因 select
  • 绘制 UML 时何时使用属性(属性)而不是关联/聚合/组合

    好吧 我有点困惑 当尝试在 UML 图中显示关系时 我应该向类添加属性 还是绘制与类的关联 例如 假设我有一个 DFA 类 其中包含 10 个状态对象 每个状态对象都有一组不同的通往 DFA 中各种状态的路径 我应该绘制从 DFA 到 St
  • 使用 SharpPcap 和 Packet.Net 发送我自己的 ARP 数据包

    到目前为止 我尝试使用 SharpPcap 发送我用 Packet Net 创建的 ARP 数据包 但没有成功 问题是即使我使用发送数据包device SendPacket它实际上没有被发送 我不知道为什么 这是我的代码 ARPPacket
  • 使用PHP exec调用Node脚本并在finally方法之前将数据返回给PHP

    我有一个 PHP 脚本 它使用exec函数来执行 Node 脚本并将一些数据返回到同一 PHP 脚本 我的问题是我需要将数据返回给 PHP 而不必等待中的清理代码finally完成 我在下面编写了一些示例代码 向您展示代码的流程并说明我的问
  • 如何通过函数参数使用 fstream(特别是 ofstream)

    嗨 我是一个c 初学者 这是我的作业之一 我有点卡住了 这不是我的全部代码 它只是我需要帮助的一小部分 我想做的是有一个函数专门用于将具有该函数的所有内容导出到text文件名为 results txt 因此 当我打开文件时 应该会显示 do
  • 将 Ruby 程序作为 Windows 服务运行?

    是否可以将 ruby 应用程序作为 Windows 服务运行 我看到有一个相关的问题讨论运行Java 应用程序作为 Windows 服务 https stackoverflow com questions 25530 best method
  • 如何在android中使用Ontouchevent突出显示此pdf页面

    这里我想使用android中的onTouchevent来突出显示这段文字 您可以使用 OnTouchListener 来获取事件的 x 和 y 然后将屏幕绘制为位图 并根据字母的左上角显示和字母的大小使用bitmap getPixel 看看
  • WSO2 API 管理器 - 我可以隐藏公共商店中的租户商店吗?

    是否可以隐藏租户商店 以便它们在公共商店中不可见 而只能通过其直接租户特定商店 URL 可见 例如 https api mydomain com store tenant mycustomer com https api mydomain
  • struct{} 和 struct{}{} 在 Go 中如何工作?

    我想知道 Go 中的 struct 和 struct 是什么意思 示例如下 array index struct or make map type struct struct is a keyword https golang org re
  • 根据设备宽度使用 CSS 更改 div 顺序

    我正在开发一个响应式网站 遇到了一个有趣的问题 我有一些并排的 div 可能有 2 到 6 个左右 当屏幕不够宽而无法正确显示所有内容时 div 会垂直堆叠 使用 CSS 就足够简单了 问题是 我需要它们根据布局采用不同的顺序 这很容易用
  • Android viewpager:添加/删除页面时出现奇怪的错误

    我不知道如何解释 所以我上传了一个视频Youtube http www youtube com watch v o5sn31IX Gc当我添加页面时一切正常 如果我从列表末尾开始并逐渐移至第一页 则删除页面也有效 但如果我删除 0 端之间的