Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ViewPager2无法正确处理片段并单击事件_Java_Android_Android Fragments_Onitemclicklistener_Android Viewpager2 - Fatal编程技术网

Java ViewPager2无法正确处理片段并单击事件

Java ViewPager2无法正确处理片段并单击事件,java,android,android-fragments,onitemclicklistener,android-viewpager2,Java,Android,Android Fragments,Onitemclicklistener,Android Viewpager2,我只是想知道我是否做错了什么,因为我对这一切都是新手。 如果您还有什么需要我补充的,请告诉我。 是回购分支,如果您想查看所有代码,我将尝试在其中实现ViewPager 上下文 因此,我有4个类别用片段表示,每个类别都有一个数组列表,其中每个项目都有一个监听器,可以重现一些音频。 我试图用一个ViewPager显示片段,但问题是,当我从一个片段滚动到另一个,然后返回已经创建的片段,它不会记录触摸事件,不会发生任何事情,甚至不会出现错误或异常。 如果我去一个新创建的片段触摸效果很好。 另外,在切换回

我只是想知道我是否做错了什么,因为我对这一切都是新手。
如果您还有什么需要我补充的,请告诉我。
是回购分支,如果您想查看所有代码,我将尝试在其中实现ViewPager

上下文 因此,我有4个类别用
片段表示,每个类别都有一个
数组列表
,其中每个项目都有一个
监听器
,可以重现一些音频。
我试图用一个ViewPager显示
片段,但问题是,当我从一个
片段
滚动到另一个,然后返回已经创建的
片段
,它不会记录触摸事件
,不会发生任何事情,甚至不会出现错误或异常。
如果我去一个新创建的
片段
触摸效果很好。
另外,在切换回已经创建的
片段后,如果我滚动一点点到另一个
片段并返回,或者出于某种原因通过该
片段的
ArrayList
它开始再次识别
ArrayList
项目中的触摸。

类似的问题并没有真正起到帮助

我试过的
  • 我尝试使用
    协调器布局
    包装
    查看页面2
    ,但没有区别
  • 我一直在阅读一些用Kotlin编写的官方viewPager2示例,但它们似乎都没有类似的情况(我也很难阅读Kotlin代码)
代码片段 word_list.xml:


activity_main.xml:


这是其中的一个片段,其他三个基本相同,只是arrayList中的项发生了变化和其他一些小事情:

/…跳过了一些不相关的代码。。。
公共类NumbersFragment扩展了片段{
私人ArrayList mWords;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图根视图=充气机。充气(R.layout.word\u列表,容器,false);
mWords=新的ArrayList();
//…将所有项目添加到列表中。。。
//为单词项创建适配器
WordAdapter=新的WordAdapter(getActivity(),mWords,R.color.category_number);
//查找列表的根视图
ListView ListView=rootView.findViewById(R.id.root\u列表\u视图);
//将适配器添加到根列表视图
setAdapter(适配器);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Log.d(“NumbersFragment”,“CLICKED”);
}
}
});
返回rootView;
}
@凌驾
公共无效暂停(){
super.onPause();
Log.d(“NumbersFragment”,“片段暂停”);
}
}
这是类别适配器,它管理片段:

公共类CategoryAdapter扩展了FragmentStateAdapter{
私有静态最终int NUM_CATEGORIES=4;
//必需的公共构造函数
公共类别适配器(@NonNull FragmentActivity FragmentActivity){
超级(碎片活动);
}
@非空
@凌驾
公共片段createFragment(int位置){
//根据用户所在的页面,
//创建相应类别的片段
开关(位置){
案例0:
返回新的NumbersFragment();
案例1:
返回新的家庭片段();
案例2:
返回新颜色片段();
违约:
返回新短语fragment();
}
}
@凌驾
public int getItemCount(){
返回NUM_类别;
}
}
这是我的主要活动:

public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//设置活动的内容以使用activity_main.xml布局文件
setContentView(R.layout.activity_main);
//查找允许用户在片段之间滑动的视图寻呼机
ViewPager2 viewPager=findViewById(R.id.viewPager);
//创建一个适配器,它知道应该在每个页面上显示哪个片段
CategoryAdapter=新的CategoryAdapter(此);
//或CategoryAdapter=新的CategoryAdapter(getSupportFragmentManager(),getLifecycle());
//将适配器设置到视图寻呼机中
viewPager.setAdapter(适配器);
}
}

将其添加到主活动
viewPager.setOffscreenPageLimit(3)中创建viewpager后

这是因为ViewPager的默认屏幕外限制为1,而ViewPager2的默认屏幕外限制为0

在ViewPager2中,切换选项卡时,将自动刷新上一个选项卡

在ViewPager中,当您自动切换到第三个选项卡时,如果您有3个或更多选项卡,第一个选项卡将被销毁,当您转到第一个选项卡时,它将被重新创建


viewPager.setOffscreenPageLimit(3)从此行切换到选项卡时,前3个选项卡将预加载,下3个选项卡将预加载,因此不会刷新任何内容。

将此添加到MainActivity
viewPager.setOffscreenPageLimit(3)中创建后viewpager@saiPavanKumar天哪,非常感谢你,这很有效。我真的不明白为什么在我的例子中,我有3个片段,如果我设置viewPager.setOffScreenPageLimit(2),当前位置是片段3,第一个片段的l