Как динамически манипулировать фрагментом в пейджере представления, когда данные, возвращаемые фрагментом, пусты - PullRequest
0 голосов
/ 06 января 2020

В своей деятельности я устанавливаю ViewPager, TabLayout и добавляю два фрагмента в список. Затем я передаю этот список ViewPagerAdapter. Ответственность за фрагмент заключается в получении данных из вызова API и отображении их в списке.

Я беру два экземпляра фрагмента, потому что api возвращает два списка данных, которые нужны быть показанным во вкладке моды (один список в одной вкладке и один в другой). Но когда адаптер viewpager возвращает фрагмент, если один список данных пуст, я получаю пустой экран в Tab-0.

Как динамически определять размер данных (здесь запутано, потому что нужно вызывать фрагмент) и заполнять вкладку на основе на что.

ActivityOne.kt

class ActivityOne : BaseActivity() {

    lateinit var item: ArrayList<HistoryTabItem>
    lateinit var tabLayout: Tabs

    val InfoViewpagerAdapter:InfoVIewPagerAdapter by lazy { InfoVIewPagerAdapter(supportFragmentManager, ArrayList()) }

    fun newInstance(context: Context): Intent {
        return Intent(context, InfoFragment::class.java)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.info_tabview)
        getFragments()
        InfoViewpagerAdapter.arrayList = item

        tabLayout = findViewById(R.id.tabsnfo_type)
        val viewPager = findViewById<ViewPager>(R.id.view_pager_info_type)
        viewPager.adapter = InfoViewpagerAdapter
        tabLayout.setupWithViewPager(viewPager)

    }



    fun getFragments() {

        item = ArrayList()

        val HistoryTabItemSeller = HistoryTabItem()
        HistoryTabItemSeller.fragment = InfoFragment.createInstance()
        item.add(HistoryTabItemSeller)

      val HistoryTabItemBuyer = HistoryTabItem()
        HistoryTabItemBuyer.fragment = InfoFragment.createInstance()
        item.add(HistoryTabItemBuyer)

    }
}

InfoViewPageradapter

class InfoVIewPagerAdapter(fm: FragmentManager, var arrayList: ArrayList<HistoryTabItem>) : FragmentPagerAdapter(fm) {

    override fun getItem(position: Int): Fragment {
        return arrayList[position].fragment
    }

    override fun getCount(): Int {
        return arrayList.size
    }
}

Фрагмент

class InfoFragment : BaseDaggerFragment(), InfoContract.View  {

    var isTickerShow: Boolean? = false
    var tickerMessage: String? = null
    lateinit var allTransactionList: ArrayList<Any>

    @Inject
    lateinit var infoPresenter: HoldInfoPresenter
    val infoAdapter: InfoAdapter by lazy { 
  InfoAdapter(ArrayList()) }
    lateinit var fakelist: ArrayList<Any>

    companion object {
        fun createInstance(): Fragment {
            return InfoFragment()
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_container_info, container, false)
        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initView()
        infoPresenter.attachView(this)
        infoPresenter.getInfo()
    }

    fun initView() {
        rv_container.layoutManager = LinearLayoutManager(context)
        rv_container.adapter = infoAdapter
    }

    override fun renderInfo(depositHistory: DepositHistory?) {
        var resultList = ArrayList<Any>()
        depositHistory?.let {
            resultList = combinedTransactionList(it.sellerData as ArrayList<SellerDataItem>, it.buyerData as ArrayList<BuyerDataItem>)
            isTickerShow = it.tickerMessageIsshow
            tickerMessage = it.tickerMessageId
        }


        infoAdapter.list.clear()
        infoAdapter.list.addAll(resultList)
        infoAdapter.notifyDataSetChanged()
    }

    fun combinedTransactionList(arrayList: ArrayList<SellerDataItem>, arrayList1: ArrayList<BuyerDataItem>): ArrayList<Any> {
        allTransactionList = ArrayList()
        allTransactionList.clear()
        allTransactionList.addAll(arrayList)
        allTransactionList.addAll(arrayList1)

        return allTransactionList
    }
}

1 Ответ

1 голос
/ 06 января 2020

Наилучшим вариантом является выборка данных в упражнении, а затем показ этого макета вкладок с 2 или только одной вкладкой. Вы бы использовали его с моделью общего представления, но я вижу, что вы здесь не используете модели представления. Вы также можете просто установить список в методе createInstance() в Fragment, когда он не пустой. Третий вариант - извлечь данные из фрагмента, а затем отправить в активность информацию о том, что список пуст, и скрыть указанную вкладку c.

...