【问题标题】:How to show content from different ArrayLists如何显示来自不同 ArrayLists 的内容
【发布时间】:2019-09-24 09:04:47
【问题描述】:

我试图在我的DialogFragment 中为不同的选项卡显示不同的内容,但由于某种原因,无论选择哪个选项卡,内容文本都会不断重复第一项。选项卡名称按预期正确显示。我认为问题在于DialogFragment 类,在createInstance 周围的for 循环内,但我不知道该区域需要更改什么。

我可以用什么来代替myListDescriptions[id] 中的id

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

预期结果

  • 标签 A描述 A
  • 标签 B描述 B
  • 标签 C描述 C

当前结果

  • 所有标签显示描述A

物品类

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)
    }
}

以前使用的代码

【问题讨论】:

    标签: android for-loop arraylist kotlin


    【解决方案1】:

    你必须做出一些改变。

    // 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
    }
    

    为避免混淆,我将处理适配器中的所有逻辑,在构造函数中传递片段管理器和列表,然后您可以在类中本地访问它们。

    MyDialogAdapter(fm,mList1,MList2)
    

    【讨论】:

    • 这行不通,因为我的适配器将被重复使用多次,其中每个列表将包含不同数量的项目。
    • for 循环中的代码呢?那里需要改变什么?
    • 首先,如果您使用的是 TabLayout,您将使用两个不同的适配器进行处理,1 个适配器用于我在这里看不到的选项卡,2 个适配器用于我在这里看不到的 viewPager .对于 for 循环,基本上,您在同一个“标题”中多次填充同一个片段。看看这个实现 (medium.com/@Abdulkadir98/…)
    • 这种实现意味着必须为我拥有的每组数据创建一个新的适配器,这效率不高。查看我的问题中的以前使用的代码。仅仅使用for 循环来为我的ArrayLists 显示两个项目中的项目不是更简单吗?
    • 为什么使用switch 大小写而不是addFragment
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多