问题描述
传统写法会有问题,TabLayoutMediator会创建多个导致多次调用ViewPager2.OnPageChangeCallback()中的onPageSelected
解决办法
保留上一个TabLayoutMediator 在创建新的关联时 detach
代码
package com.jtexplorer.atsfds.util;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.jtexplorer.atsfds.R;
import java.util.List;
/**
* @author yuge
*/
public class GyyTabUtil {
private final Fragment fragment;
private final String TAG;
private static TabLayoutMediator tabLayoutMediator;
public GyyTabUtil(Fragment fragment) {
this.fragment = fragment;
this.TAG = getString(R.string.TAG);
}
private String getString(int id) {
return fragment.getString(id);
}
/**
* 初始化 tabLayout和viewPager2
*
* @param tabLayout tabLayout
* @param tabFragmentList 标签名对应的页面 一定一一对应 一定要设置Arguments 为这个界面名字
* @param viewPager2 viewPager2
*/
public void initTab(TabLayout tabLayout, List<Fragment> tabFragmentList, ViewPager2 viewPager2) {
if (GyyStringUtil.isEmpty(tabLayout)) {
Log.d(TAG, "initTab: tabLayout 为空");
return;
}
//清除所有tab
if (tabLayout.getTabCount() > 0) {
tabLayout.removeAllTabs();
}
if (tabLayoutMediator != null) {
tabLayoutMediator.detach();
tabLayoutMediator = null;
}
if (GyyStringUtil.isEmptyList(tabFragmentList) || GyyStringUtil.isEmpty(viewPager2)) {
Log.d(TAG, "initTab: " + "没有tabFragment或viewPager2");
return;
}
//设置tag
for (Fragment fragment : tabFragmentList) {
tabLayout.addTab(tabLayout.newTab().setText(
fragment.getArguments().getString("label", "null")
));
}
//设置对应界面
viewPager2.setAdapter(new FragmentStateAdapter(fragment) {
@NonNull
@Override
public Fragment createFragment(int position) {
return tabFragmentList.get(position);
}
@Override
public int getItemCount() {
return tabFragmentList.size();
}
});
//预加载
viewPager2.setOffscreenPageLimit(viewPager2.getChildCount());
//建立关联
//这里需要根据position修改tab的样式和文字等
tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager2, true, (tab, position) -> {
//这里需要根据position修改tab的样式和文字等
String tabName = tabFragmentList.get(position)
.getArguments().getString("label", "null");
tab.setText(tabName);
});
//最后一定要attach()
tabLayoutMediator.attach();
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
//显示调用 是否多次调用
Log.d(TAG, "initTab: " + position);
}
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
}
});
}
}