几天以来,我尝试在 viewpager2 中处理 recyclerview 中的数据。viewpager 有一个适配器管理 recyclerview 中的数据。但我尝试做的一切似乎都不起作用。也许我误解了目的或其他什么。我希望你可以帮助我。
此活动管理 viewpager 及其适配器。它将数据发送到内部回收器视图:
public class AudioFilePanel extends AppCompatActivity
{
private String currentTab;
private ViewPagerAdapter adapter;
private ViewPager2 viewPager;
private TabLayout tabLayout;
private Map<String, List<String>> content;
private String path;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_audio_file_panel);
viewPager = findViewById(R.id.view_pager2);
tabLayout = findViewById(R.id.tabs);
Button addFilesByTag = findViewById(R.id.add_files_with_tag);
if (null == currentTab)
{
currentTab = "music";
}
content = listByTag();
adapter = new ViewPagerAdapter(getApplicationContext(), new ArrayList<>(content.values()));
viewPager.setAdapter(adapter);
new TabLayoutMediator(tabLayout, viewPager,
(tab, position) -> tab.setText(content.keySet().toArray()[position].toString())).attach(); …Run Code Online (Sandbox Code Playgroud) 我将 ViewPager2 与 TabLayout 连接。其他提到 ViewPager 的帖子提供了重写 setCurrentItem(position, false) 的方法,其中 false 会禁用平滑滚动。但是,TabLayoutMediator 调用 onTabSelected(TabLayout.Tab tab) ,后者调用 viewpager.setCurrentItem(postion, true)。如果 TabLayoutMediator 以及 ViewPager2 都是最终的,我如何覆盖此行为?
已经尝试过:
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
viewPager.setCurrentItem(position, false);
}
});
Run Code Online (Sandbox Code Playgroud)
并像这样重写 onTabSelected :
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(viewPager.getPosition(), false);
}
......
}
Run Code Online (Sandbox Code Playgroud) 所以在旧版本中,您可以设置使用ViewPager的初始位置ViewPager
viewPager.setCurrentItem(x)
你如何做到这一点ViewPager2?
android android-adapter android-recyclerview android-viewpager2
没有过度滚动的方法,因为ViewPager2我需要检测过度滚动,这样一旦没有更多页面,我就可以将用户带回主页。
我有基本的 ViewPager2 和 Tablayout - 在每个页面中我都有不同的片段。当我需要不从第一个(默认)选项卡打开此视图时,我正在这样做:
viewPager.currentItem = selectedTabPosition
Run Code Online (Sandbox Code Playgroud)
此代码选择选项卡,但在其中打开第一个选项卡的片段!仅当我通过点击来选择选项卡时 - 我才能在每个选项卡中看到正确的片段。我也尝试使用 Tablayout 进行选择,如下所示:
tabLayout.getTabAt(position)?.select()
Run Code Online (Sandbox Code Playgroud)
但这段代码没有帮助,也可以解决这个错误。我也尝试过设置viewPager.currentItem-post / postDelay但这也不起作用。
也许我失去了一些东西?或者这是 ViewPager2 中的错误?
(编辑 - ViewPager 代码)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupPagerAdapter()
}
private fun setupPagerAdapter() {
val adapter = MainDocumentScreenPagerAdapter(this)
binding?.viewPager?.letUnit {
it.adapter = adapter
binding?.tabsPagerView?.attachViewPager(requireContext(), it, adapter)
// set tab
it.currentItem = params.pageType.ordinal
}
Run Code Online (Sandbox Code Playgroud)
适配器代码
class MainDocumentScreenPagerAdapter (fragment: Fragment) : ViewPager2TitleAdapter(fragment) {
override fun getItemCount(): Int = DocumentPageType.values().size
override fun createFragment(position: …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-tablayout android-viewpager2
> Could not resolve all files for configuration ':app:debugCompileClasspath'.
> Could not find com.androidx.multidex:multidex:2.0.1.
Required by:
project :app
Run Code Online (Sandbox Code Playgroud)
在我的项目中添加 multidex 后出现此错误
我有一个活动,其中有NavHostFragment. 这NavHostFragment将承载三个片段,其中两个是FragmentA和FragmentB。在 里面FragmentB,我有一个ViewPager2有两页的页面:PageA和PageB,两者实际上都是由一个片段 构建的FragmentC。在每个PageA和里面PageB,我都有一个RecyclerView。
这是 的布局 XML FragmentB。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/keyline_4"
android:clipChildren="false"
android:clipToPadding="false"
tools:context=".ui.NavigationActivity">
...
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/frag_course_view_pager"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="@dimen/keyline_4"
android:clipChildren="false"
... />
<com.google.android.material.tabs.TabLayout
android:id="@+id/frag_course_tablayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/keyline_4"
... />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
如您所见,我已将片段的根布局设置clipChildren为false. 我也将ViewPager2's设置clipChildren为false。PageA …
android android-layout android-view android-recyclerview android-viewpager2
从 ViewPager2 的嵌套片段导航回来的正确方法是什么?
尽管使用app:defaultNavHost="true"与FragmentContainerView在页面的分片嵌套按后退按钮同时呼吁活动的背压,而不是导航回到以前的片段。
我正在使用导航组件,并且在我的主页片段中有一个 ViewPager2。我们知道viewPager2也包含Fragment。如何通过viewpager2的片段调用父函数?我尝试过一些方法,例如在构造函数中传递函数,但我意识到使用单例模式创建的片段。我只知道如何在构造函数中传递函数,例如标准类(不是单例类)
我的适配器
class DetailSliderAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
private val images = mutableListOf<String>()
fun addImages(lsImage: List<String>){
images.addAll(lsImage)
notifyDataSetChanged()
}
override fun getItemCount(): Int = images.size
override fun createFragment(position: Int): Fragment {
return SliderImageFragment.newInstance(images[position])
}
class SliderImageFragment: Fragment(){
companion object{
const val EXTRA_SLIDER_IMAGE = "extra_slider_image"
fun newInstance(imageStr: String) = SliderImageFragment().apply {
this.arguments = Bundle().apply {
this.putString(EXTRA_SLIDER_IMAGE, imageStr)
}
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.item_slide_image, container, false)
}
override fun onActivityCreated(savedInstanceState: …Run Code Online (Sandbox Code Playgroud) 我有一个带有 3 个相关片段的底部导航视图的活动。其中之一是带有使用 FragmentStateAdapter 的 ViewPager2 的 Fragment。在适配器的 createfragment(int position) 方法内,我返回另一个 Fragment 的几个实例,其中有一个选项菜单,在它的 onCreate() 中我调用 setHasOptionsMenu(true)。问题是在适配器初始化时,所有片段的菜单都是可见的,而不仅仅是当前可见片段的菜单。在第一次滑动之后,菜单似乎失效了,一切都应该如此。如果我通知适配器有关添加了另一个片段的更改,然后为新添加的片段出现另一个菜单项,也会出现此问题。我看到了一个类似的问题,但答案是在片段的 onResume() 方法中调用 setHasOptionsMenu() ,但这似乎不是处理此问题的正确行为。在评论中,另一个用户建议将 ViewPager2 升级到另一个版本,但我使用的是最新版本。谁能告诉我如何处理这个问题?
我正在使用ViewPager2用于显示 3 个适配器项目.. 每个项目都有不同的布局。所以viwepager2在更改viewpager2.
请为Viewpager2.
我目前正在编写一份说明手册,该手册确实有页面 - 并使用ViewPager2.
到目前为止,我已经找到了 的点指示符ViewPager,但没有找到 的点指示符ViewPager2。我想提供更好的视觉反馈,以便人们一开始就可以看到有更多页面。如何以最少的努力使用点指示器扩展 ViewPager2?这不是对场外资源的请求 - 尽管我自己的答案使用了一个库。请随意添加更好(更轻量级)的答案。
android ×12
java ×2
android-architecture-navigation ×1
android-view ×1
androidx ×1
fragment ×1
kotlin ×1
pagination ×1