我开始了解 ViewPager2 并尝试实现它,但没有找到任何合适的示例。
谁能告诉我如何使用它。
我正在寻找正确的用法,而不是示例。
原文由 Pratik Butani 发布,翻译遵循 CC BY-SA 4.0 许可协议
我开始了解 ViewPager2 并尝试实现它,但没有找到任何合适的示例。
谁能告诉我如何使用它。
我正在寻找正确的用法,而不是示例。
原文由 Pratik Butani 发布,翻译遵循 CC BY-SA 4.0 许可协议
以防万一有人想监听 ViewPager2.OnPageChangeCallback
事件:
private final ViewPager2.OnPageChangeCallback onPageChangeListener = new ViewPager2.OnPageChangeCallback() {
/**
* This method will be invoked when the current page is scrolled, either as part
* of a programmatically initiated smooth scroll or a user initiated touch scroll.
* @param position Position index of the first page currently being displayed.
* Page position+1 will be visible if positionOffset is nonzero.
* @param positionOffset Value from [0, 1) indicating the offset from the page at position.
* @param positionOffsetPixels Value in pixels indicating the offset from position.
*/
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
/**
* This method will be invoked when a new page becomes selected.
* Animation is not necessarily complete.
* @param position Position index of the first page currently being displayed.
* Page position+1 will be visible if positionOffset is nonzero.
*/
@Override
public void onPageSelected (int position) {
super.onPageSelected(position);
if (position == 2) { // SomeFragment
Log.d(LOG_TAG, "ViewPager2.onPageSelected( " + position + " )");
SomePagerAdapter adapter = (SomePagerAdapter) viewpager.getAdapter();
if (adapter != null) {
SomeFragment fragment = (SomeFragment) adapter.getItem(position);
fragment.onLateInit();
}
}
}
};
与 ViewPager2.registerOnPageChangeCallback()
一起应用:
viewpager.registerOnPageChangeCallback(this.onPageChangeListener);
FragmentStateAdapter
需要持有一个 ArrayList<Fragment> mItems
,以便可以访问提前构建的实例。 SomeFragment
暴露方法 public void onLateInit()
,因为 @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
可能无法使用(取决于 Fragment
)
public Fragment getItem(int position) {
return this.mItems.get(position);
}
与此类似,可以解决这个问题,在人们能够正确初始化它的视图之前很久就构建了 Fragment
,例如。在前一个 Fragment
中输入数据。对于大量的 Fragment
(…) 来说,它可能不是最佳选择,但对于少数人来说,它工作得很好。
原文由 Martin Zeitler 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答1.3k 阅读✓ 已解决
2 回答2.6k 阅读
2 回答1.7k 阅读
1 回答2.1k 阅读
1 回答1.1k 阅读
1 回答1.3k 阅读
1.3k 阅读
更新 7
检查: 从 ViewPager 迁移到 ViewPager2
检查: 使用 ViewPager2 创建带有标签的滑动视图
更新 6
如果您想使用 View Pager2 实现 Carousel,请查看我的答案
更新 5
示例代码
在下面使用
dependencies
示例代码
带有 ViewPager2 的 TabLayout
来自文档
ViewPager2
FragmentStateAdapter
替换FragmentStatePagerAdapter
RecyclerView.Adapter
替换PagerAdapter
registerOnPageChangeCallback
替换addPageChangeListener
示例代码
新的功能
示例代码
示例代码
对于
HORIZONTAL Orientation
使用对于
VERTICAL Orientation
使用添加新项目的示例代码
删除新项目的示例代码
更新
如果你想使用
Fragment
和ViewPager2
试试这个有关更多信息,请查看此
更新 2
新的功能
setUserInputEnabled
,isUserInputEnabled
)API 更改
ViewPager2
类决赛Bug修复
FragmentStateAdapter
稳定性修复在 viewpager2 中禁用滑动的示例代码
更新 3
FragmentStateAdapter
现在需要一个Lifecycle
对象。添加了两个实用程序构造函数以从主机FragmentActivity
或主机 Fragment 获取它示例代码
更新 4
ItemDecorator
引入的行为与RecyclerView
一致。MarginPageTransformer
引入以提供在页面之间(页面插入之外)创建空间的能力。CompositePageTransformer
引入以提供组合多个的能力PageTransformers
FragmentStateAdapter#getItem
方法重命名为FragmentStateAdapter#createFragment
- 以前的方法名称已被证明是过去的错误来源。OFFSCREEN_PAGE_LIMIT_DEFAULT
值从 0 变为 -1。如果使用了OFFSCREEN_PAGE_LIMIT_DEFAULTconstant
,则无需更改客户端代码。示例代码