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个选项卡将预加载,因此不会刷新任何内容。将此添加到MainActivityviewPager.setOffscreenPageLimit(3)中代码>创建后viewpager@saiPavanKumar天哪,非常感谢你,这很有效。我真的不明白为什么在我的例子中,我有3个片段,如果我设置viewPager.setOffScreenPageLimit(2),当前位置是片段3,第一个片段的l