spinnerなどで項目を切り替えた際に、タブの数を動的に変える処理をViewPagerを使ってやってみたがハマったのでメモ
タブでViewPagerを切り替えるレイアウト
view_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#eff1f4"
android:orientation="horizontal">
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
ViewPagerにセットするレイアウト(RecyclerViewを渡すだけ)
fragment_list.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"/>
</LinearLayout>
タブとviewpagerのレイアウト
main_fragment.kt
class tabFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.view_pager, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//spinnerに設置する処理
spinner.adapter = spinnerAdapter
//spinnerの値に応じたタブリストを用意する
val tabList = ....
// viewpager用のFragmentPagerAdapter *childFragmentManagerを渡すのが肝
val tabAdapter = tabsPagerAdapter(childFragmentManager, context, tabList.size)
view_pager.adapter = tabAdapter
}
TabsPagerAdapter.kt
class TabsPagerAdapter(fm: FragmentManager, context: Context, page:Int) : FragmentPagerAdapter(fm) {
//タブの数
val size = page
private var selectedSpinnerId:Int = 0
override fun getItem(position: Int): Fragment {
val fragment = RecyclerViewFragment.newInstance(position)
return fragment
}
// 表示されるタブの数
override fun getCount(): Int {
return page
}
fun addAll(tabListMap:MutableList<MutableMap<Int,String>>,spinnerId:Int) {
tabList.addAll(tabListMap)
selectedSpinnerId = spinnerId
}
}
RecyclerViewFragment.kt
class AdSearchResultFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_list, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// APIなどから取ってきたデータをRecyclerViewに設置する処理(省略)
}
companion object {
fun newInstance(position: Int): RecyclerViewFragment {
val recyclerViewFragment = RecyclerViewFragment()
return recyclerViewFragment
}
}
}