Вложенный адаптер Kotlin для просмотра подсписков - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь выяснить, как я могу вложить представление списка в другое представление списка, используя 2 адаптера.
В настоящее время у меня есть фрагмент, показывающий список групп, но я также хотел бы показать членов группы. группа. Поскольку количество членов не фиксировано, они должны отображаться динамически.

Ниже приведены мой класс groupOverview и мой GroupAdapter. Мой xml-файл - это просто общее представление, содержащее listView и другой xml для представления каждой строки списка.

Я знаю, что мне нужно создать еще один Adapter и line.xml для моих членов, но я понятия не имею, как мне это сделать. я должен добавить их в мой существующий код ниже.

Список, который я пытаюсь отобразить:

 var groupList: ArrayList<Group> = arrayListOf(
            Group("Groep1", arrayListOf("Jan", "Piet", "Joris", "Korneel")),
            Group("Groep2", arrayListOf("Octaaf", "Alberto", "Samson", "Bobientje")),
            Group("Groep3", arrayListOf("Kwebbel", "Plop", "Smul", "Klus")),
            Group("Groep4", arrayListOf("Blossom", "Butters", "Buttercup"))
        )

Файл Fragment.kt:

class GroupOverview : Fragment() {
    var adapter: GroupAdapter? = null
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = DataBindingUtil.inflate<FragmentGroupOverviewBinding>(
            inflater,
            R.layout.fragment_group_overview,
            container,
            false
        )

        adapter = GroupAdapter(
            activity!!.applicationContext,
            GroupProvider.groupList

        )

        //set adapter
        binding.lineGroup.adapter = adapter


        return binding.root

    }
}

Адаптер:

class GroupAdapter:BaseAdapter {

    var groupList = ArrayList<Group>()
    var context: Context? = null

    constructor(context: Context, groupList: ArrayList<Group>) : super() {
        this.context = context
        this.groupList = groupList
    }

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

    override fun getItem(position: Int): Any {
        return groupList[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val group = this.groupList[position]

        var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        var groupView = inflator.inflate(R.layout.group_entry, null)
        groupView.txtGroep.text = group.name!!
        groupView.setOnClickListener{ view ->
            view.findNavController().navigate(R.id.action_groupOverview_to_projectOverviewFragment)
        }


        return groupView
    }
}

1 Ответ

0 голосов
/ 07 ноября 2019

Я не знаю, почему вы используете ListView в 2019 году. Я покажу здесь свое решение с RecyclerView, поскольку ListView - более простая и менее ориентированная на производительность версия, вы можете использовать его в своем ListView.

Логика в том, что у вас есть пустой LinearLayout внутри вашего R.layout.group_entry. И в методе onBind () (, в то время как RV привязывает значения к держателю вида ), вы вручную добавляете динамическое число представлений к этому LinearLayout

XML-макет для элементов списка:

Добавьте LinearLayout к вашему R.layout.group_entry, это будут контейнеры для членов вашей группы

<LinearLayout
       android:id="@+id/ll_sub_category_list                
       android:layout_width="match_parent"
       android:layout_height="wrap_content"        
       android:orientation="vertical"/>

Активность / фрагмент:

Инициализируйте адаптер и отправьте список

val adapter = MyAdapter()
        my_recycler_view.adapter = adapter 
        my_recycler_viewlayoutManager = 
        LinearLayoutManager(this)
        adapter.setItems(groupList)

Адаптер:

Определите адаптер, который работает со списком групп. Добавляет динамические числа TextViews к пустым LinearLayout в зависимости от количества членов в объекте группы

        class MyAdapter() : RecyclerView.Adapter<MyViewHolder>() {

        private var items: MutableList<Group> = mutableListOf()

            override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
                holder.onBind(items[position])
            }

            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder<Group> {
                return createVH(parent)
            }

        private fun createVH(parent: ViewGroup): MyViewHolder{
                val view = LayoutInflater.from(parent.context)
                        .inflate(R.layout.group_entry, parent, false)
                val holder = MyViewHolder(view)
                return holder
            }

override fun getItemCount(): Int {
        return items.count()
    }

    fun setItems(list: List<Group>) {
        items.clear()
        items.addAll(list)
        notifyDataSetChanged()
    }

    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

            fun onBind(group: Group){
                itemView.run{
                    object.members.forEach{

                    val view = TextView(itemView.context)
                    view.text = it.name
                    ll_sub_category_list.addView(subCategoryView)
                }
              }
           }

        }

 }
...