我正在构建一个应用程序,它使用 来ViewPager2水平滚动页面,每个页面都有一个垂直滚动的内容RecyclerView,其中每个列表的第一个位置都有一行带有水平滚动小部件(例如另一个)RecyclerView或ViewPager2附加到寻呼机指示器类型小部件,如从下图。
父 ViewPager2 是 CoordinatorLayout 的子级,当 RecyclerView 垂直滚动时,它会处理折叠顶部内容。然后,此 ViewPager2 会膨胀水平滚动的片段。所以我们有parent layout:
-- CoordinatorLayout
-- FrameLayout - has appbar scrolling behavior
-- ViewPager2
-- AppBarLayout
-- CollapsingToolbarLayout
-- ImageView - background
-- Toolbar
-- ConstraintLayout - Holds title and date
Run Code Online (Sandbox Code Playgroud)
父 ViewPager2 child fragments' layout:
-- FrameLayout
-- RecyclerView
-- Pager Indicator
Run Code Online (Sandbox Code Playgroud)
RecyclerView 内容的第一行具有相同的布局:
-- FrameLayout
-- RecyclerView
-- Pager Indicator
Run Code Online (Sandbox Code Playgroud)
您可以从上面的屏幕截图中看到,第一次加载时RecyclerView重叠,AppBarLayout这是正确的行为。marginTop我向的父布局添加了 negative …
android-recyclerview android-collapsingtoolbarlayout android-appbarlayout android-viewpager2
当我切换到 viewPager2 时,我必须实现另一种类型的适配器(我使用 FragmentPagerAdapter,现在使用 FragmentStateAdapter),现在我想调用具有旧适配器的 instantiateItem 元素,但它不会出现在新适配器中。
public void onPageChange(int position) {
//I cannot call instantiateItem from pagerAdapter
Object object = pagerAdapter.instantiateItem(mMainViewPager,position);
if (object instanceof MapFragment) {
MapFragment fragment = (MapFragment) object;
//fragment.setDevice(mDevice);
//fragment.setLastTracking();
}
if (object instanceof DevicesFragment) {
DevicesFragment fragment = (DevicesFragment) object;
//fragment.refresh();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个垂直滚动ViewPager2,最后一个孩子包含一个RecyclerView相同方向的滚动。
这导致了一个冲突的行为,ViewPager2当我在包含 this 的页面时总是窃取滚动事件RecyclerView。在里面滚动的唯一方法RecyclerView是,如果我滚动得非常慢,如果我让它变快,就像滑动事件一样ViewPager2滚动并更改页面。
目前,我正在做一个修复,涉及禁用用户交互isUserInputEnabled,当页面ViewPager2更改的页面包含时,将标志更改为 false RecyclerView,但欢迎来自框架的通用解决方案:)
有人告诉我使用 FragmentStateAdapter 的 createFragment 覆盖来按索引获取当前片段。
这就是我的适配器的样子。
class AddRestaurantPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
FragmentStateAdapter(fragmentManager, lifecycle) {
private var fragments = listOf<Fragment>(
FragmentA.newInstance(),
FragmentB.newInstance(),
FragmentC.newInstance(),
FragmentD.newInstance()
)
override fun getItemCount() = 4
override fun createFragment(position: Int) =
fragments[position]
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到我们在此活动/片段上强制使用 onSaveInstance/OnRestoreInstance。
ViewPager2 重新加载已经存在的片段,我们需要一种方法来访问它。FragmentStateAdapter 类中的以下 LOC 证明了这一点
private void ensureFragment(int position) {
long itemId = getItemId(position);
if (!mFragments.containsKey(itemId)) {
// TODO(133419201): check if a Fragment provided here is a new Fragment
Fragment newFragment = createFragment(position);
newFragment.setInitialSavedState(mSavedStates.get(itemId));
mFragments.put(itemId, newFragment);
}
}
Run Code Online (Sandbox Code Playgroud)
在 activity/fragment recreation …
我需要根据服务器配置文件在运行时将片段添加到 viewpager2 以及选项卡。我见过的大多数 viewpager2 资源都展示了使用新 TabMediator 选项卡布局的静态 viewpager2。我正在跳过 viewpager,因为我需要添加 viewpager2 支持的 RTL 和垂直滚动。
我最关心的是当我添加和删除片段时如何跟踪特定页面/片段的索引。已完成本教程和代码作为示例。
android android-fragments android-tablayout android-viewpager2
我使用 ViewPager2 和 FragmentStateAdapter 来绑定片段。我的每个片段都有 3 个垂直排列的回收器视图。问题是我无法在片段内滚动回收器视图,而且当我尝试垂直滚动内容时,视图分页器会更改选项卡。如何解决这个问题?
我正在寻找一个无限循环来在 ViewPager2 中显示图片。
在图片之间以及最后一个和第一个项目之间以及第一个和最后一个项目之间使用“幻灯片”页面转换器(我认为是默认的)。
我发现的难点是:
Integer.maxValue物品,setCurrentItem(x, false)不太好看的过渡。fragments我使用ViewPager2和显示 5 FragmentStateAdapter。每个fragment都有ExoPlayer实例。我正在维护ViewPager2.setOffscreenPageLimit(1),并且加载效果良好fragments。但是,当我向下滚动到ViewPager2,pos4时pos2,pos1应该调用 onStop(), onDestroyView(), onDestroy()。但这并没有发生。
除非我按 ,否则这些方法都不会执行onBackPress()。我在FragmentStateAdapter.
我想执行exoPlayer.release()以onDestroyView()释放应用程序的内存。
这是代码
活动
List<Post> postsList = response.getPosts();
ViewPagerAdapter adapter = new ViewPagerAdapter(this, postsList);
binding.pager.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
binding.pager.setOffscreenPageLimit(1);
binding.pager.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
ViewPager适配器
public class ViewPagerAdapter extends FragmentStateAdapter {
private List<Post> postList;
public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity, List<Post> postList) {
super(fragmentActivity);
this.postList = postList;
}
@NonNull
@Override
public …Run Code Online (Sandbox Code Playgroud) android fragment android-viewpager exoplayer android-viewpager2
我有一个活动,FragmentHome 包含 viewpager2。在viewpager 里面有FirstFragment。
当我想从 FirstFragment 导航到不在 viewpager2 中的 SecondFragment 时
它抛出
java.lang.IllegalArgumentException: navigation destination com.example.mymessangerfcm:id/action_FirstFragment_to_SecondFragment is unknown to this NavController
Run Code Online (Sandbox Code Playgroud)
亲爱的社区如何处理这样的导航,为什么会抛出异常?
有没有办法强制 ViewPager2 RTL 方向?我已设置android:layoutDirection="rtl"为 viewpager2 但由于android:supportsRtl="false"清单中它仍然是 LTR。我该如何解决这个问题?