Как показать контент из разных ArrayLists - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь показать различный контент для разных вкладок в моем DialogFragment, но по какой-то причине текст контента продолжает повторять первый элемент независимо от выбранной вкладки.Имена вкладок отображаются правильно, как и ожидалось.Я полагаю, что проблема заключается в классе DialogFragment в цикле for вокруг createInstance, но я не знаю, что нужно изменить в этой области.

Что я могу использовать вместо id in myListDescriptions[id]?

for (item in myListTitles) {
    adapter.addFragment(id, FragmentDialogContent.createInstance(myListDescriptions[id]))
}

Ожидаемый результат

  • Вкладка A с Описание A
  • Вкладка B с Описание B
  • Вкладка C с Описание C

Текущий результат

  • Все вкладки показывают Описание A

enter image description here

enter image description here

enter image description here

Класс изделия

data class Item (val myDialogTitle: String,
                 val myDialogDescription: String)

Класс адаптера

class MyDialogAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
    private var mTitleCollection: MutableList<String> = ArrayList()
    private var mFragmentCollection: MutableList<Fragment> = ArrayList()

    fun addFragment(title: String, fragment: Fragment) {
        mTitleCollection.add(title)
        mFragmentCollection.add(fragment)
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return mTitleCollection[position]
    }

    override fun getItem(position: Int): Fragment {
        return mFragmentCollection[position]
    }

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

Класс DialogFragment

class FragmentDialogContent(val myList: ArrayList<Item>) : DialogFragment() {    
    private var mText = ""

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return customView
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val b = AlertDialog.Builder(activity)
                .setTitle("Dialog Title")
                .setPositiveButton(getString(android.R.string.ok)) { dialog, _ -> dialog.dismiss() }

        val adapter = MyDialogAdapter(childFragmentManager)
        for (item in myListTitles) {
            adapter.addFragment(id, FragmentDialogContent.createInstance(myListDescriptions[id]))
        }

        b.setView(customView)
        return b.create()
    }

    companion object {
        fun createInstance(txt: String): FragmentDialogContent {
            val fragment = FragmentDialogContent()
            fragment.mText = txt
            return fragment
        }
    }
}

Класс фрагмента

class MyFragment : androidx.fragment.app.Fragment() {
    private lateinit var mRecyclerView: RecyclerView

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

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        val v = view

        mRecyclerView = v!!.findViewById<RecyclerView>(R.id.my_recyclerview)

        mRecyclerView.layoutManager = LinearLayoutManager(activity)

        val myList = ArrayList<Item>()

        val myListTitles = ArrayList<String>()
        myListTitles.add("Tab A")
        myListTitles.add("Tab B")
        myListTitles.add("Tab C")

        val myListDescriptions = ArrayList<String>()
        myListDescriptions.add("Description A")
        myListDescriptions.add("Description B")
        myListDescriptions.add("Description C")


        val mAdapter = MyAdapter(myList, childFragmentManager)

        mRecyclerView.adapter = mAdapter

        super.onActivityCreated(savedInstanceState)
    }
}

ранее использованный код

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Вы должны внести некоторые изменения.

// Returns the fragment to display for that page
when (position) {
  0 // tab # 0 - This will show FirstFragment
  -> return addFragment("title 1", MyDialog.createInstance(mTitleCollection[position]))

  1 // Tab #1 - This will show SecondFragment
  -> return addFragment("title2", MyDialog.createInstance(mTitleCollection[position]))

  2 // Tab # 2 - This will show ThirdFragment
  -> return addFragment("title 3", MyDialog.createInstance(mTitleCollection[position]))

  else -> return null
}

Чтобы избежать путаницы, я бы обработал всю логику в адаптере, передавая fragManager и списки в конструкторе, затем вы можете получить к ним доступ локально внутрикласс.

MyDialogAdapter(fm,mList1,MList2)
0 голосов
/ 06 мая 2019

Не могу проверить здесь (я сейчас на работе), но у меня была похожая проблема в прошлом, и я решил ее, добавив ее в свой адаптер для пейджинга фрагментов:

override fun getItemPosition(`object`: Any): Int {
    return POSITION_NONE
}

edit: версия котлина

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...