viewPager2 = findViewById(R.id.view_pager2);
tabLayout = findViewById(R.id.tab_layout);
//禁止ViewPager的左右滑动
viewPager2.setUserInputEnabled(false);
viewPager2.setOffscreenPageLimit(3);
viewPager2.setAdapter(new FragmentStateAdapter(supportFragmentManager, getLifecycle()) {
@NonNull
@Override
public Fragment createFragment(int position) {
switch (position){
case 0 :
chatFragment = new mChatFragment();
return chatFragment;
case 1 :
terminalFragment = new mTerminalFragment();
return terminalFragment;
case 2 :
controlFragment = new mControlFragment();
return controlFragment;
default:
return null;
}
}
@Override
public int getItemCount() {
return 3;
}
});
tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
//ViewPager选中时对Tab执行的代码
switch (position){
case 0 :
tab.setText("对话模式");
break;
case 1 :
tab.setText("终端模式");
break;
case 2 :
tab.setText("控件模式");
break;
default: break;
}
}
});
tabLayoutMediator.attach();
messageRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
Log.e("RecyclerViewLayout","newTop:"+top+"\tnewBottom:"+bottom);
}
});
我的ViewPager2中管理着3个Fragment,其中两个Fragment都有RecyclerView,这两个RecyclerView都管理着同样的实时更新的item数据,但是我发现在ViewPager2中当RecyclerView有item数据实时更新出来时所有的item都会闪烁或者发生奇怪的偏移。但是这一系列的现象在ViewPager中都没有出现到,我对这个现象进行了一系列的追溯,有了一点眉目,但不知道该如何解决这个问题,下面展示3种我调试的现象,欢迎大家来参观讨论,我挺期待用上ViewPager2的:
现象1(ViewPager2的问题现象):
https://user-images.githubusercontent.com/92635075/218529620-d582962a-768d-4222-acd3-6ae7dc38c810.mp4
OnLayoutChangeListener中捕获的日志如下(RecyclerView每新增一个item其中的newBottom都会发生两次改变先是0后面变成1953,我认为导致这个问题的原因就在于newBottom改变成了0):
于是我对令newBottom变成0的代码经行了追溯,发现下面两处有可能是导致newBottom变成0的代码(我能力有限,只能debug后建立断点后一点点往回看,希望理解),令我好奇的是下面两处代码在newBottom变成1953时并没有被执行,这也让我更加肯定下面两处代码把newBottom变成了0:
![图片](https://user-images.githubusercontent.com/92635075/218523520-7094f0d5-38f2-42a1-ad3e-0113a8d0baad.png)
现象2(把xml布局文件中ViewPager2的layout_height="0dp"修改成固定的"350dp",其它部分代码同上)
https://user-images.githubusercontent.com/92635075/218533124-8edc3331-902e-4871-81a1-8ab639687215.mp4
修改后的xml代码如下
捕获日志如下(可见RecyclerView每新增一个item其中的newBottom只更新了一次,且都为963,可以说没有改变,一切正常,但这样的固定值的布局显然不是我想要的):![图片](https://user-images.githubusercontent.com/92635075/218530841-365d48ee-7a80-4ba4-98a9-60340da5f314.png)
现象3(把ViewPager2改回用ViewPager)
https://user-images.githubusercontent.com/92635075/218538822-9a35decf-20e5-4b6d-abfc-cc3a0f69ffc0.mp4
捕获日志如下(一切正常):![图片](https://user-images.githubusercontent.com/92635075/218538344-8f68e3fb-532e-4b1e-bdd8-7dd681e2174d.png)
最后贴上RecyclerView的item更新代码