我很高兴谷歌发布了基于 RecyclerView 构建的ViewPager2,解决了旧 ViewPager 存在的很多问题。
我很快将旧的 ViewPager 代码替换为 ViewPager2:
用 xml 中的 ViewPager2 替换 ViewPager
替换FragmentPagerAdapter(FragmentManager)为FragmentStateAdapter(Fragment)
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
我想使用,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抱怨它不能有孩子。在另一方面,如果我将PagerTabStrip出ViewPager2报告它必须是一个孩子ViewPager。
所以似乎PagerTabStrip与ViewPager2. 我对么?
目前是否有任何解决方案?(除了自己写PagerTabStrip)
该应用程序使用 android viewpager2 (androidx.viewpager2:viewpager2:1.0.0-beta04) 来显示幻灯片。每张幻灯片的上半部分都有视频,下半部分有文字。每张幻灯片都是使用相同的片段类构建的(代码如下)
演讲活动
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) 我正在使用最新版本的 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 页时,第一页将被破坏,它现在正在工作
任何人都可以向我解释这两个属性之间的区别吗?
非常感谢
我正在使用ViewPager2与FragmentStateAdapter. 基本 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)
对于上面的代码,我有两个问题。
编辑:将片段管理器传递给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)
我正在使用ViewPager2withTabLayout和FragmentStateAdapter在选项卡中显示片段。我发现,当我在较慢的设备(即 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) 我正在将 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)效果很好。)
我该如何解决这个问题?
我用于paging3在 中显示无尽的列表RecyclerView。当我单击特定项目时,我需要显示详细信息片段。详细信息片段包含一个视图分页器,其适配器也是PagingDataAdapter。也就是说,具有详细信息的片段应该显示我在上一屏幕上选择的元素,并且还可以水平滚动到也逐页加载的其他元素。问题是我无法从某个位置开始在视图寻呼机中显示分页列表。该列表始终从头开始显示。我找不到这个问题的解决方案。是否可以从特定位置开始监听页面源(RemoteMediator)的数据?请帮我:(
android android-view android-recyclerview android-viewpager2 android-paging-3
我当前状态的视频,以便更好地了解我的情况:
\n视频
\RecyclerView 上面的所有内容都在 AppbarLayout 内
具有类似行为的 Reddit 应用示例:
\n视频
目标:
\n1-实现滚动屏幕,视图按从上到下的顺序排列
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]\nRun Code Online (Sandbox Code Playgroud)\nRecyclerView2-需要它与并ViewPager包含fragments包含一起工作RecyclerViews
3-保留RecyclerViews回收。
\n到目前为止我的解决方案:
\n协调器布局,AppBarLayout 与appbar_scrolling_view_behavior和scroll|exitUntilCollapsed。 …
android android-recyclerview android-coordinatorlayout android-appbarlayout android-viewpager2