TabLayout+ViewPage2+Fragment动态增加和减少

1. viewpager的adapter

private inner class PageFragmentStateAdapter(
        fragmentManager: FragmentManager,
        lifecycle: Lifecycle
    ) :
        FragmentStateAdapter(fragmentManager, lifecycle) {
        private var dataObserver: RecyclerView.AdapterDataObserver? = null
        override fun createFragment(position: Int): Fragment {
            try {
                return sonFragments[position].newInstance()
            } catch (e: IllegalAccessException) {
                e.printStackTrace()
            } catch (e: java.lang.InstantiationException) {
                e.printStackTrace()
            }
            throw IllegalStateException("创建子页面异常")
        }

        override fun getItemCount(): Int {
            return sonFragments.size
        }

        override fun getItemId(position: Int): Long {
            //动态添加fragment,刷新adapter
            //这里重写,才会刷新fragment个数
            return sonFragments[position].hashCode().toLong()
        }

        override fun registerAdapterDataObserver(observer: RecyclerView.AdapterDataObserver) {
            dataObserver = observer
            super.registerAdapterDataObserver(observer)
        }

        fun unregisterAdapterDataObserver() {
            if (dataObserver != null) {
                unregisterAdapterDataObserver(dataObserver!!)
                dataObserver = null
            }
        }
    }

2.添加fragment和title

 @SuppressLint("NotifyDataSetChanged")
    private fun addTabFragment() {
        if (titleArray.size == ALL_TAB_TITLE || sonFragments.size == ALL_TAB_TITLE) {
            return
        }
        //tabTitleElement即顶部title数组
        titleArray.add(2, tabTitleElement[2])
        sonFragments.add(2, MessageOperateFragment::class.java)
        pagerAdapter.notifyDataSetChanged()
        binding.vpMessage.post {
        //刷新title数量
        binding.tlMessage.selectTab(binding.tlMessage.getTabAt(mCurrentPosition), false)
        }
    }

3.减少fragment和title

@SuppressLint("NotifyDataSetChanged")
    private fun decreaseTabFragment() {
        if (titleArray.size == NO_LOGIN_TAB_TITLE || sonFragments.size == NO_LOGIN_TAB_TITLE) {
            return
        }
        titleArray.removeAt(2)
        sonFragments.removeAt(2)
        pagerAdapter.notifyDataSetChanged()
        binding.vpMessage.post {
            binding.tlMessage.selectTab(binding.tlMessage.getTabAt(mCurrentPosition), false)
        }
    }
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐