android - 如何显示来自不同 ArrayLists 的内容
问题描述
我正在尝试为我的不同选项卡显示不同的内容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
物品类别
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)
}
}
以前使用的代码
解决方案
你必须做出一些改变。
// 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)
推荐阅读
- scala - Spark scala - 计算动态时间戳间隔
- python - 命令在 shell 中有效,但在子进程中无效
- node.js - Vue UI 的内存限制如何提高
- r - 按 varname 汇总分组
- ruby-on-rails - 触发回调 after_commit 但不是由于触摸
- spring-boot - 使用 HTTPUrlConnection 进行 Mockito 单元测试
- asp.net-mvc-5 - MVC 5 Ajax.BeginForm 提交按钮调用当前页面而不是指定的控制器和操作的 URL
- python - Django-nose 失败 - KeyError: u'en-us'
- html - 如何在 HTML Body 中为 Google Apps 脚本上的自动电子邮件格式化数字
- ios - Picker 查看未捕获的异常 SWIFT