ViewPager addOnPageChangeListener 不适用于同一选项卡单击

2023-12-01

我有一个ViewPager with addOnPageChangeListener. ViewPager有 3 个选项卡视图(tab1、tab2、tab3)。当用户单击 tab2 时,它会加载一些数据(基本上是RecyclerView)。此时,如果用户再次单击 tab2,我需要重新加载数据,但在这种情况下addOnPageChangeListener没有被触发。

我的代码:

customPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager(), MainActivity.this);
viewPager.setAdapter(customPagerAdapter);

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {
    }

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    public void onPageSelected(int position) {
        Log.i("TAG", "position: " + position);
        switch (position) {
            case 0:
                addingMarker(LocationData.find(LocationData.class, "Category = ? ", "1"));
                break;
            case 1:
                addingMarker(LocationData.find(LocationData.class, "Category = ? ", "2"));
                break;
            case 2:
                addingMarker(LocationData.find(LocationData.class, "Category = ? ", "3"));
                break;
        }
    }
});
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setupWithViewPager(viewPager);

原答案:

Android 团队对 TabLayout 和 ViewPager 相互通信的方式进行了一些更改。阅读文档。但事情并没有得到很好的解释。我在代码中添加了很多注释。我希望这有帮助。

final ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
Adapter adapter = new Adapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);

// the tabs will get their titles from the adapter and get populated
tabLayout.setTabsFromPagerAdapter(adapter);

// this is done "so that the tab position is kept in sync"
// what it does is when you swipe the fragment in view pager, it updates the tabs
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

// without this listener the tabs would still get updated when fragments are swiped, but ....  (read the next comment)
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        Toast.makeText(MainActivity.this, "tabSelected:  " + tab.getText(), Toast.LENGTH_SHORT).show();
        // no where in the code it is defined what will happen when tab is tapped/selected by the user
        // this is why the following line is necessary
        // we need to manually set the correct fragment when a tab is selected/tapped
        // and this is the problem in your code
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
        Toast.makeText(MainActivity.this, "tabReSelected:  " + tab.getText(), Toast.LENGTH_SHORT).show();

        // Reload your recyclerView here
    }
});

看看这个issue如果您有任何其他问题。

编辑 1:2015 年 12 月

不是这个问题的解决方案,但总体上有帮助。

tabLayout.setupWithViewPager(viewPager);

这样,您就不必担心在选择选项卡时自己设置片段。tabLayout.setOnTabSelectedListener(..)在这种情况下不再需要。就是这样处理的在引擎盖下。当您不需要对选项卡进行太多控制时(例如在选择/点击同一选项卡时重新加载片段),这非常有用。

更新:2018 年 5 月

tabLayout.setTabsFromPagerAdapter(adapter);
tabLayout.setOnTabSelectedListener(...);

上述两个函数均已弃用。初始化viewpager+tablayout如下图:

viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager); // this will automatically bind tab clicks to viewpager fragments
viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))

// do additional tab clicks here
// no need to manually set viewpager item based on tab click
tabLayout.addOnTabSelectedListener(...);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ViewPager addOnPageChangeListener 不适用于同一选项卡单击 的相关文章

  • 如何做Android - 滑动抽屉从左到右滑动..?

    如何将android滑动抽屉从LTR滑动 使用时android orientation horizontal 它从 RTL 滑出 我该如何进行 LTR 谢谢 我找到了答案表格 Here http blog sephiroth it 2011
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • Android 中多个蓝牙连接的自定义 UUID

    我有一个 Android 设备作为服务器连接到多个蓝牙 Android 客户端 我了解 UUID 的概念以及它的独特之处 我的问题是 我可以为连接到我的服务器的所有客户端使用相同的 UUID 吗 如果没有 我如何以编程方式为我的客户端生成
  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • Android WebView里面的ScrollView只滚动scrollview

    在我的应用程序中 我有一个 ScrollView 其中包含一些线性视图 一些文本视图和一个 Webview 然后是其他线性布局等 问题是 WebView 不滚动 Scroll 仅侦听 ScrollView 有什么建议么
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A

随机推荐

  • A-Frame .obj 模型显示但已损坏

    这里是框架的初学者 已经完成了教程场景 现在正在设置我的第一个使用 obj 模型 使用远程服务器 感觉这是重要的信息 我看到过有关模型未显示的问题 但我的模型显示已损坏 我不知道从哪里开始修复它 This is how it looks i
  • 使用 freeswitch 在网络浏览器中发起呼叫和接听呼叫

    我有一个要求 我有一个网站 我想在其中实现拨出呼叫和拨入呼叫功能 我在 Windows 上使用 freeswitch 作为 sip 服务器 目前我可以使用 verto 在本地分机上发起呼叫 如何直接从浏览器向手机发起出站呼叫 并且还可以使用
  • 如何在 Tfs Build 中参数化 DeployIisAppPath Msbuild 参数

    我正在使用 Tfs 2012 构建 部署我们的 Asp Net Web 应用程序 我们有一个构建定义 可构建 5 个解决方案 sln 文件 这就是我们的 MsBuild 参数的样子 p DeployOnBuild True p AllowU
  • 尽管参数类型不同,但双重定义错误

    我在以下两种方法上收到双重定义错误 def apply T state T onRender T gt Graphic onMouseEvent MouseEvent T gt T GraphicPanel apply state onRe
  • Postgres排序问题

    我想按 DESC 评级排序 它适用于 MySQL 但适用于 PostgreSQL 我得到了不同的结果 您可以在这里看到问题 http www vinderhimlen dk konkurrencer 我的控制器 def sort colum
  • 使用 C# 退出 Excel(同时使用 Excel 自动化)

    我正在使用 C 将数据读取 写入 Excel 电子表格 我正在使用这三个语句来打开我的 Excel 文件 Excel Application excelapp new Excel Application Excel Worksheet wo
  • C# 网格数据源多态

    我有一个网格 我正在设置DataSource to a List
  • Android Play 商店 market:// 链接不再有效?

    在过去的一年里 我一直从我的域重定向我的用户 http example com get 至 market details id com example myapp 今天我在 Nexus 5 LG G3 OnePlus One 上通过 Chr
  • 如何使用正则表达式将非字母数字字符替换为空格?

    我构建了一个 Javascript 函数来将第一个字母变为大写 我的问题是我有一些类似于 name something 的单词 而我想要的是 Name Something 我这样做了 function toCamelCase text re
  • 无法读取未定义的角度4的属性“名称”[重复]

    这个问题在这里已经有答案了 我正在尝试在组件模板中打印一个值 但我收到上述错误Cannot read property name of undefined 我已经从这个问题的代码中删除了额外的内容 我想访问第一行详细信息 组件文件 impo
  • Python:如何执行外部程序

    如何从程序内部执行程序而不阻塞 直到执行的程序完成 我努力了 os system 但它会停止我的程序 直到执行的程序停止 关闭 有没有办法让我的程序在外部程序执行后继续运行 考虑使用子流程 module Python 2 http docs
  • Javascript序列化窗口对象

    我想序列化一个包含窗口的窗口对象 这样 如果通过反序列化它并重新设置其属性来刷新 php 页面 则可以在内存中保持窗口打开 是否可以 例如 object window open test html 使用场景 当一个窗口打开时 它的引用是在创
  • 在一本大书中找到 10 个最常用的单词 [重复]

    这个问题在这里已经有答案了 我知道这个问题已经在论坛上被问过几次了 我没有找到任何可以被认为是最合适的解决方案的 标记 答案 所以再次询问 我们从书中得到了一篇非常大的文本 所有这些文本都无法放入内存中 我们需要找到文本中出现频率最高的 1
  • 解析地理查询始终为空

    我目前正在尝试让 Parse 的地理查询系统正常工作 在我的数据浏览器上 我安装了一个地理点类型的关键 位置 其中设置了纬度 30 27263636013176 和经度 97 75766807716373 的地理点 但是 如果我尝试使用以下
  • 如何获取Excel表格中选中的复选框值

    我正在执行一项与使用 Java 读取包含单选按钮和复选框的 excel 相关的任务 我已经尝试了很多 但无法进一步进行此操作 当我尝试读取包含复选框的单元格的数据时 它返回一个空值 有人可以帮忙解决这个问题吗 控件不包含在单元格中 而是作为
  • 如何使用 Ghostscript 将 PDF 转换为图像

    我发现 Ghostscript 能够将 PDF 转换为图像格式 I tried PDF 到图像转换器但无法清楚地理解它 我已经安装了gs905w64 exe但当我尝试add reference对于我的网络应用程序 我收到此错误 A refe
  • 位置无关代码指向错误地址

    我有一个用 NASM 2 11 08 编写的针对 macho64 架构的小示例程序 我正在运行 OSX 10 10 3 bits 64 section data msg1 db Message One 10 0 msg1len equ ms
  • Visual Studio 2015 混合应用程序 - 获取“EPERM,不允许操作”

    我遇到了一种荒谬的情况 我很高兴听到你们如何处理它 我有一个混合应用程序项目 Visual Studio 2015 Cordova Tools 在其中的 res 文件夹下 我有应用程序资源 整个项目 包括资源 均处于源代码控制 TFS 之下
  • Pandas 每月滚动操作

    我在写出这个问题时最终弄清楚了 所以我无论如何都会发布并回答我自己的问题 以防其他人需要一点帮助 Problem 假设我们有一个DataFrame df 包含此数据 import pandas as pd from io import St
  • ViewPager addOnPageChangeListener 不适用于同一选项卡单击

    我有一个ViewPager with addOnPageChangeListener ViewPager有 3 个选项卡视图 tab1 tab2 tab3 当用户单击 tab2 时 它会加载一些数据 基本上是RecyclerView 此时