标签: android-viewpager2

如果滚动位置为 0,ViewPager2 中的片段不会响应点击

我很高兴谷歌发布了基于 RecyclerView 构建的ViewPager2,解决了旧 ViewPager 存在的很多问题。

我很快将旧的 ViewPager 代码替换为 ViewPager2:

  1. 用 xml 中的 ViewPager2 替换 ViewPager

  2. 替换FragmentPagerAdapter(FragmentManager)FragmentStateAdapter(Fragment)

  3. ViewPager 设置如下:

    viewPager.adapter = fragmentAdapter
    
    val mediator = TabLayoutMediator(tabLayout, viewPager, true) { tab, position ->
        tab.text = fragmentAdapter.tabNames[position]
    }
    mediator.attach()
    
    Run Code Online (Sandbox Code Playgroud)

没有进行其他更改。

问题

执行上述更改后,我意识到一个问题——

现在我的 ViewPager 是一个普通的水平寻呼机,我的每个片段fragmentAdapter都有一个垂直的RecyclerView.

我观察到,当 RecyclerView 的滚动位置为 0 时,该 RecyclerView 中的项目无法接收任何单击或长按事件,但可以滚动。一旦滚动,它可以再次收到点击。*

知道这ViewPager2也是一个RecyclerView,是否与嵌套的 RecyclerView 有关系?

android android-viewpager android-recyclerview android-touch-event android-viewpager2

7
推荐指数
1
解决办法
2235
查看次数

如何在 ViewPager2 中使用 PagerTabStrip

我想使用,ViewPager2因为它应该替换ViewPager,我希望摆脱一些我遇到的问题ViewPager

我想做这个:

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/detail_pager_view"
    android:layout_height="match_parent"
    android:layout_width="match_parent" >

    <androidx.viewpager.widget.PagerTabStrip
        android:id="@+id/detail_pager_strip"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_width="match_parent" />

</androidx.viewpager2.widget.ViewPager2>
Run Code Online (Sandbox Code Playgroud)

ViewPager2抱怨它不能有孩子。在另一方面,如果我将PagerTabStripViewPager2报告它必须是一个孩子ViewPager

所以似乎PagerTabStripViewPager2. 我对么?

目前是否有任何解决方案?(除了自己写PagerTabStrip

android pagertabstrip android-viewpager2

7
推荐指数
1
解决办法
629
查看次数

使用 setCurrentItem 打开幻灯片时,Viewpager2 转换卡在一半

该应用程序使用 android viewpager2 (androidx.viewpager2:viewpager2:1.0.0-beta04) 来显示幻灯片。每张幻灯片的上半部分都有视频,下半部分有文字。每张幻灯片都是使用相同的片段类构建的(代码如下)

如果一张一张地滑动,幻灯片放映绝对可以正常工作,但是如果尝试打开“setCurrentItem”,有时幻灯片会卡在转换过程中,如下图所示。

显示幻灯片卡在转换中的屏幕截图

演讲活动

myViewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
    myViewPager2.setAdapter(myAdapter);
    myViewPager2.setOffscreenPageLimit(3);

    myViewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            super.onPageScrolled(position, positionOffset, positionOffsetPixels);
            if (mLoadedFragment != null) {
                mLoadedFragment.pauseMedia();
            }
        }

        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);

            try {
                rvSlideIndex.invalidate();
                adapterSlideIndex.updateSelectedSlide(position);
                //setTitle(mSlides.get(position).getTitle());
                setScreenTitle(mSlides.get(position).getTitle());

                mLoadedFragment = ((PresentationSlideFragment) myAdapter.createFragment(position));
                mLoadedFragment.startVideo();

            } catch (Exception e) {

            }

        }

        @Override
        public void onPageScrollStateChanged(int state) {
            super.onPageScrollStateChanged(state);

            if (mLoadedFragment != null && state == ViewPager2.SCROLL_STATE_SETTLING) {
                mLoadedFragment.clearMediaPlayer();
            }
        } …
Run Code Online (Sandbox Code Playgroud)

android android-viewpager androidx android-viewpager2

6
推荐指数
1
解决办法
1163
查看次数

Offscreenpagelimit vs setItemViewCacheSize ViewPager2

我正在使用最新版本的 ViewPager2 'androidx.viewpager2:viewpager2:1.0.0-beta04'

我有 10 页,每一页都是 Fragment。

如果我设置,viewpager2.offscreenPageLimit = 1 我必须滚动到第 5 页以使第一页销毁。

发生了什么???,当我滚动到第 3 页时,第一页应该被破坏了吧??

然后我尝试另一种方式使它正确

(viewpager2.getChildAt(0) as RecyclerView).layoutManager?.isItemPrefetchEnabled = false
(viewpager2.getChildAt(0) as RecyclerView).setItemViewCacheSize(1)
Run Code Online (Sandbox Code Playgroud)

这样,当我滚动到第 3 页时,第一页将被破坏,它现在正在工作

任何人都可以向我解释这两个属性之间的区别吗?

非常感谢

android android-viewpager kotlin android-viewpager2

6
推荐指数
0
解决办法
2098
查看次数

如何在ViewPager2中使用PagerTitleStrip?

PagerTitleStrip我有in的标准实现ViewPager,但它无法在ViewPager2. 如果我想迁移到ViewPager2,我应该如何PagerTitleStrip实施ViewPager2?我找到了解决方案和许多有关如何使用实现行为的详细信息,但它不适用于.PagerTabStripTabLayoutPagerTitleStrip

android pagertitlestrip android-viewpager2

6
推荐指数
1
解决办法
728
查看次数

在 ViewPager2 中启动子片段

我正在使用ViewPager2FragmentStateAdapter. 基本 3 片段 (ABC)。这意味着,您可以从 A 滚动到 B,从 B 滚动到 C

我想做的事?

从片段 B 开始子片段 D

(A-B-C) | D 从片段B开始片段D,当用户单击“后退箭头”(顶部栏)时,片段D将被销毁并且用户将回到B。(我不想使用activity)

我尝试了什么?

val ft: FragmentTransaction = requireActivity().supportFragmentManager.beginTransaction()
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
ft.replace(android.R.id.content, DetailsFragment())
ft.addToBackStack(null)
ft.commit();
Run Code Online (Sandbox Code Playgroud)

对于上面的代码,我有两个问题。

  1. 两个片段(B 和创建的 D)重叠(我同时看到 B 和 D)
  2. 单击后退按钮(顶部栏上)时,片段 B 或 D 都不会关闭

编辑:将片段管理器传递给ViewPager2onCreate() 方法中的 main_activity

pagerAdapter = PagerAdapter(supportFragmentManager, lifecycle)
binding.mainViewPager.adapter = pagerAdapter
Run Code Online (Sandbox Code Playgroud)

PagerAdapter 是一个简单的类: class PagerAdapter(fm: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fm, lifecycle)

android android-viewpager android-viewpager2

6
推荐指数
1
解决办法
4208
查看次数

ViewPager2 在慢速设备上或调试时无法显示正确的片段

我正在使用ViewPager2withTabLayoutFragmentStateAdapter在选项卡中显示片段。我发现,当我在较慢的设备(即 Nexus 5X)上运行它时,或者当我在createFragment()方法中放置断点时,在我更改为带有片段的稍后选项卡(尚未创建)后,会显示最后一个位置的片段。

例如我有 20 个项目。我选择位置 15 上的选项卡。位置 15、14、16、17、18、19 和 20 上的片段被创建(createFragment()称为)。我预计只会创建 14、15、16 个。在慢速设备上或在createFragment()方法内部停止调试器时,会显示位置 20 上的片段。

在未减速的设备上不会发生此问题。

主要活动:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    initViewPager2WithFragments()
}

private fun initViewPager2WithFragments() {
    val viewPager2: ViewPager2 = findViewById(R.id.viewpager)
    val adapter = ExampleStateAdapter(supportFragmentManager, lifecycle)
    viewPager2.adapter = adapter

    val tablayout: TabLayout = findViewById(R.id.tablayout)
    val names: Array<String> = arrayOf(
        "Fragment A",
        "Fragment B",
        "Fragment C",
        "Fragment D",
        "Fragment …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewpager2

6
推荐指数
1
解决办法
1844
查看次数

调用notifyDataSetChanged时FragmentStateAdapter不调用createFragment

我正在将 aViewPager2与 a 一起使用FragmentStateAdapter

public class MyAdapter extends FragmentStateAdapter {

    public MyAdapter(@NonNull Fragment fragment) {
        super(fragment);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return MyFragment.newInstance(MyClass.func(position));
    }

    @Override
    public int getItemCount() {
        return MyClass.NUM;
    }

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,调用notifyDataSetChanged()适配器根本没有任何效果。(打电话notifyItemChanged(position)效果很好。)

我该如何解决这个问题?

android android-viewpager2 fragmentstateadapter

6
推荐指数
2
解决办法
3712
查看次数

安卓。如何使用 Paging 3 从特定位置加载分页数据?

我用于paging3在 中显示无尽的列表RecyclerView。当我单击特定项目时,我需要显示详细信息片段。详细信息片段包含一个视图分页器,其适配器也是PagingDataAdapter。也就是说,具有详细信息的片段应该显示我在上一屏幕上选择的元素,并且还可以水平滚动到也逐页加载的其他元素。问题是我无法从某个位置开始在视图寻呼机中显示分页列表。该列表始​​终从头开始显示。我找不到这个问题的解决方案。是否可以从特定位置开始监听页面源(RemoteMediator)的数据?请帮我:(

android android-view android-recyclerview android-viewpager2 android-paging-3

6
推荐指数
1
解决办法
1478
查看次数

AppBarLayout 具有滚动行为替代/滚动时粘性视图/大高度 AppBarLayout 导致奇怪的滚动

我当前状态的视频,以便更好地了解我的情况:
\n视频
\RecyclerView 上面的所有内容都在 AppbarLayout 内

\n

具有类似行为的 Reddit 应用示例:
\n视频

\n

目标:
\n1-实现滚动屏幕,视图按从上到下的顺序排列

\n
a)[several views that need to scroll top until gone, their combined height is several screen sizes]  \nb)[view that scrolls until it reaches screen top and then sticks there]  \nc)[Recy\xd1\x81lerView that scrolls beneath view that sticks on screens top] or [ViewPager with fragments containing RecyclerViews]\n
Run Code Online (Sandbox Code Playgroud)\n

RecyclerView2-需要它与并ViewPager包含fragments包含一起工作RecyclerViews

\n

3-保留RecyclerViews回收。

\n

到目前为止我的解决方案:

\n

协调器布局,AppBarLayout 与appbar_scrolling_view_behaviorscroll|exitUntilCollapsed。 …

android android-recyclerview android-coordinatorlayout android-appbarlayout android-viewpager2

6
推荐指数
1
解决办法
883
查看次数