我正在开发一个需要TabLayout绑定到ViewPager2. 阅读本文并遵循此处的代码,我需要使用TabLayoutMediator. 但是在导入时,我遇到了Unresolved reference错误。我知道这个错误指的是什么,但我在依赖项和导致错误的东西中找不到任何问题。正如第二个链接中提到的,这个类包含在androidx.viewpager2:viewpager2:1.0.0-beta03其中是链接所讨论内容的更新版本。我还尝试将版本降级到链接中提到的版本,但效果不佳。这是我的build.gradle文件:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation …Run Code Online (Sandbox Code Playgroud) 我正在使用带有两个垂直方向的片段的 ViewPager2。当用户向下滑动到第二个片段时,有一个 RecyclerView 在同一垂直方向滚动内容。
问题是当我滚动 RecyclerView 的内容时,有时 ViewPager2 捕获滚动事件,有时 RecyclerView 捕获滚动事件。
我希望这样,当用户滚动到 RecyclerView 的顶部时,ViewPager 仅在用户到达 RecyclerView 内容的顶部时才滑回第一个片段。
我试过使用 recyclerView.isNestedScrollingEnabled = false,但运气不佳。我也尝试将 RecyclerView 放入 NestedScrollView,但不推荐这样做,因为 RecyclerView 然后创建它需要的数据集的每个 ViewHolder,这显然效率不高。
vertical-scrolling android-fragments android-recyclerview android-nestedscrollview android-viewpager2
我试图在我的主片段中放置一个带有 2 个选项卡(2 个片段)的 ViewPager2。
我的片段类扩展了 Fragment,我需要它包含一个 ViewPager2,其中实现了片段。
我无法在网络上找到清楚地解释这一点的指南,因为所有这些指南都是在扩展 FragmentActivity 而不是 Fragment 的类中实现的。
例如:https : //developer.android.com/training/animation/screen-slide-2#fragment
在索引处删除/添加片段会导致 Viewpager2 出现意外行为。这是不可能的,ViewPager但预计可以与Viewpager2. 它会导致重复的片段和不同步TabLayout。
这是一个重现此问题的演示项目。有一个切换按钮可以删除片段并将其重新附加到特定索引处。在这种情况下,附加的片段应该是绿色的,但它是蓝色的,不知何故有 2 个蓝色片段。
这是我的适配器的外观
class ViewPager2Adapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {
val fragmentList: MutableList<FragmentName> = mutableListOf()
override fun getItemCount(): Int {
return fragmentList.size
}
override fun createFragment(position: Int): Fragment {
return when (fragmentList[position]) {
FragmentName.WHITE -> WhiteFragment()
FragmentName.RED -> RedFragment()
FragmentName.GREEN -> GreenFragment()
FragmentName.BLUE -> BlueFragment()
}
}
fun add(fragment: FragmentName) {
fragmentList.add(fragment)
notifyDataSetChanged()
}
fun add(index: Int, fragment: FragmentName) {
fragmentList.add(index, fragment)
notifyDataSetChanged()
}
fun remove(index: Int) …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-viewpager2
如何在ViewPager2中预加载下一页和页面?我的应用程序在每个 ViewPager2 选项卡屏幕中使用来自 api 的列表。在用户滑动到下一页之前加载下一页是很好的用户体验。在旧的 ViewPager 上它是自动完成的
我有一个Viewpager2内部Fragment(称为HomeFragment)。那Viewpager本身也包含着Fragments。当我离开HomeFragment它的视图时,其视图将被破坏,而当我向后导航时,将重新创建该视图。现在,我设置的适配器Viewpager2的HomeFragment过程中onViewCreated()。因此,当我回到该适配器将被重新创建HomeFragment,这也重新创建所有Fragments的Viewpager2和当前项目重置为0,如果我尝试重新使用的适配器,我实例化第一个创建的HomeFragment我得到一个异常,因为此检查位于FragmentStateAdapter:
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
checkArgument(mFragmentMaxLifecycleEnforcer == null);
Run Code Online (Sandbox Code Playgroud)
有人知道我在回溯时如何防止重新创建所有内容吗?否则,这是相当大的性能开销,并且会阻碍我的用户体验。
android android-fragments android-navigation android-recyclerview android-viewpager2
我有 4 个片段的 viewpager2。其中 3 个具有 SwipeRefreshLayout 来刷新特定片段中的异步任务数据。
使用 SwipeRefreshLayout 和 viewpager2 时,手势会有些冲突。IE。向下滑动刷新使屏幕变得如此敏感,向左或向右移动一点也会使页面屏幕发生变化并且刷新图标冻结或过程未完成。
我的目标是使手势独立,例如,当我开始向下滑动 SwipeRefreshLayout 时,vp2 被禁用,因此它不会干扰 SRL。
使用带有 SwipeRefreshLayout 的标准 viewpager 时不会发生这种情况,手势没有冲突,但我需要在 VP2 中使用“setUserInputEnabled”。知道如何减轻这种行为,我应该在 SwipeRefreshLayout 级别还是在 viepager2 代码中减轻它?
我有一个附加到新 ViewPager2 的 FragmentStateAdapter。在之前的 ViewPager 实现中,有多种实现无限/无限滚动的方法。如何在 ViewPager2 中这样做?
提前致谢。
我有一个里面有一个片段的 ViewPager2,
在片段中,我有一个自定义视图,其中包含涉及移动手指的某些触摸逻辑。
当内部视图拦截触摸事件时,如何防止 ViewPager 滑动?
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event?.action == MotionEvent.ACTION_DOWN || event?.action == MotionEvent.ACTION_MOVE) {
//Do some stuff here
}
return true
}
Run Code Online (Sandbox Code Playgroud)
在滑动此视图时,视图寻呼机仍会滑动到其他页面。
我使用 ViewPager2 来显示从服务器获取的数据,并使用 Paging 3 库保存到 Room 数据库。我的问题是,如何通过代码导航到特定的视图寻呼机项目?如果我使用 viewPager.setCurrentItem(position, false) 那么这不起作用。例如,如果我在向左/向右滑动时动态加载总共 3000 个项目,如何将位置设置为 1000,然后从那里双向导航/加载数据?我无法让它发挥作用。
PS:在下面的 DogPagingMediator 类中,我还尝试在刷新块中设置一些起始编号而不是最新(最高)编号,但是在加载应用程序时,如果编号较高的项目不这样做,则视图寻呼机只会从此位置开始t 存在于数据库本地,否则它将始终从编号最高的项目开始,无论刷新中返回的页面如何(我假设因为dogDao.getDogs() 按降序获取数据库中的所有项目)。
PPS:我使用实时数据而不是 Flow 的原因是因为 Flow 在我滑动时由于某种原因导致 NullPointerException 。
包含视图分页器的片段中的 onCreateView 代码:
lifecycleScope.launch {
// Fetch the latest dog item from the network (data is sorted by descending)
if (!browseDogsViewModel.latestDogIsFetched()) {
browseDogsViewModel.setLatestDogNumber()
}
browseDogsViewModel.pagingDataStream.observe(viewLifecycleOwner) {
adapter.submitData(viewLifecycleOwner.lifecycle, it)
}
}
Run Code Online (Sandbox Code Playgroud)
从视图模型来看:
val pagingDataStream = repository.getAllDogsPagingData()
suspend fun setLatestDogNumber() {
latestDogNumber = repository.getLatestDogNumber()
}
Run Code Online (Sandbox Code Playgroud)
从存储库:
fun getAllDogsPagingData() = Pager(
config = PagingConfig(pageSize = PAGE_SIZE),
remoteMediator …Run Code Online (Sandbox Code Playgroud)