viewPager2 + TabLayout 实现 动态 调整tab和fragment数量
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.xxx_layout)
initView()
requestData()
}
private fun requestData() {
// xxx...请求数据
initTabs()
}
private fun initView() {
}
private var tabDatas: List<TestBean>? = null
private var mMediator: TabLayoutMediator? = null
private val mAdapter by lazy {
Viewpager2Adapter(this)
}
private fun initTabs(tabData: List<TestBean>?) {
if (tabData.isNullOrEmpty()) {
// 自定义 空布局
empty_layout?.visibility = if (tabLayout?.tabCount == 0) View.VISIBLE else View.GONE
return
}
this.tabDatas = tabData
// 确定 tab页数量
if (viewpager?.adapter == null) {
viewpager?.adapter = mAdapter
viewpager.offscreenPageLimit = 1
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
tab?.customView?.apply {
//自定义 选中的tab要进行的操作 比如样式变化等等
// time_tv?.isSelected = true
// state_tv?.isSelected = true
}
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
tab?.customView?.apply {
//自定义 未选中的tab要进行的操作 比如样式变化等等
// time_tv?.isSelected = false
// state_tv?.isSelected = false
}
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
}
// 简单实现 待优化
mAdapter.clearAllFragment()
// 添加 frament
for (i in tabData.indices) {
// 添加自定的frament
mAdapter.addFragment(xxxFragment.newInstance(xxx))
}
mMediator?.detach()
// 配置 与 tablayout 建立连接
mMediator = TabLayoutMediator(tabLayout, viewpager, object : TabLayoutMediator.TabConfigurationStrategy {
override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
val tabContent = tabData[position]
if (tab.customView != null) {
// 动态改变 tab 内容
// tab.customView?.viewId?.text = "自定义内容"
// tab.customView?.viewId?.text = "自定义内容"
} else {
// 添加自定义 tab 布局
val tabView = LayoutInflater.from(this@xxxActivity).inflate(R.layout.xxx_layout, tabLayout, false)
// 自定义tab内容
//tabView.time_tv.text = "自定义内容"
//tabView.state_tv.text = "自定义内容"
tab.customView = tabView
}
}
})
// 绑定 viewpager2 和 tablayout
mMediator?.attach()
// 刷新
viewpager?.adapter?.notifyDataSetChanged()
}
override fun onDestroy() {
super.onDestroy()
// 解除绑定
mMediator?.detach()
}
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
// viewPager2的adapter 本质上是RecyclerView 的Adapter
// viewPager2 的 适配器
public class Viewpager2Adapter extends FragmentStateAdapter {
private List<Fragment> fragments;
public Viewpager2Adapter(@NonNull AppCompatActivity activity) {
super(activity);
if (fragments == null) {
fragments = new ArrayList<>();
}
}
public void addFragment(Fragment fragment) {
if (fragments != null) {
fragments.add(fragment);
}
}
public void deleteFragment(Fragment fragment) {
if (fragments != null) {
fragments.remove(fragment);
}
}
public void clearAllFragment() {
if (fragments != null) {
fragments.clear();
notifyDataSetChanged();
}
}
@NonNull
@Override
public Fragment createFragment(int position) {
return fragments.get(position);
}
@Override
public int getItemCount() {
return fragments.size();
}
}
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/d_48"
android:layout_marginTop="@dimen/dp_10"
android:paddingLeft="@dimen/d_12"
android:paddingRight="@dimen/d_12"
app:tabIndicatorHeight="0dp"
app:tabMode="scrollable"
app:tabRippleColor="@android:color/transparent" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f5f5f5"/>