Как реализовать трехуровневый расширяемый список / вид переработчика / вид дерева с радиогруппами на третьем уровне - PullRequest
0 голосов
/ 02 апреля 2019

Я застрял в ситуации, когда мне нужно использовать расширяемый список 3 уровня, а на самом низком / 3 уровне будет радиогруппа. 2-й уровень может иметь несколько подуровней. Другими словами, 2-й уровень может иметь несколько детей.

Я пробовал развернутое представление списка в представлении Recycler, но поскольку представление Recycler раздувает представление в OnCreateView. Я не могу изменить размер представления в OnBindHolder. Аналогичная проблема с ExpandableListView внутри ExpandableListView.

Я пробовал библиотеку AndroidTreeView. https://github.com/bmelnychuk/AndroidTreeView

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

Я пытался изменить класс OnViewHolder для третьего уровня. но я не могу обрабатывать проверки других переключателей должным образом, даже если я делаю это. Действие должно быть перезапущено, чтобы применить изменения, которые вызывают рывок. Это то, чего я не хочу.

Вот мой третий уровень OnViewHolderClass:


class ThirdListViewHolder(context: Context, var reloadView: () -> Unit) :
    TreeNode.BaseNodeViewHolder<ThirdListViewHolder.IconTreeItem>(context) {

    override fun createNodeView(node: TreeNode, value: IconTreeItem): View {
        val inflater = LayoutInflater.from(context)
        val view = inflater.inflate(R.layout.item_child_view_package_order_items_expandable_list_view, null, false)
        val tvValue = view.findViewById(R.id.select_item_check_box) as RadioButton
        tvValue.text = value.text
        tvValue.tag = value.tag


        tvValue.setOnCheckedChangeListener { buttonView, isChecked ->
            if (isChecked) {

                val getTag = tvValue.tag.toString().split("_")

                for (i in 0 until checkListControl.size) {
                    val grandParentID = checkListControl.get(i).grandParentID
                    val parentID = checkListControl.get(i).parentID
                    val childID = checkListControl.get(i).childID
                    val isChecked = checkListControl.get(i).isChecked

                    if (grandParentID.equals(getTag[0]) && parentID.equals(getTag[1]) && childID.equals(getTag[2])) {

                        val oldItem = CheckListControl(getTag[0], getTag[1], getTag[2], tvValue.text.toString(), false)
                        checkListControl.remove(oldItem)

                        val newItem = CheckListControl(getTag[0], getTag[1], getTag[2], tvValue.text.toString(), true)
                        tvValue.isChecked = true

                        checkListControl.add(newItem)
                        break

                    }
                }
            }
            reloadView()
        }
        return view
    }

    class IconTreeItem {
        var icon: Int = 0
        var tag: String? = null
        var text: String? = null
        var isChecked: Boolean = false
    }


    fun manageList(tag: String, name: String, isChecked: Boolean) {

        Log.d("tag_value", tag)
        var parentId: String? = null
        var itemId: String? = null

        val ids = tag.split("_")
        parentId = (ids.get(0).toInt() + 1).toString()


        for (i in 0 until PackageOrderItemsActivity.itemIdsList.size) {
            if (PackageOrderItemsActivity.itemIdsList.get(i).name.equals(name)) {
                itemId = PackageOrderItemsActivity.itemIdsList.get(i).item_id
            }
        }

        if (isChecked) {
            //Add
            if (PackageOrderItemsActivity.ParentChildHashMap.containsKey(parentId)) {
                val array = PackageOrderItemsActivity.ParentChildHashMap.get(parentId)
                if (!array!!.contains(itemId)) {
                    array.add(itemId!!)
                    PackageOrderItemsActivity.ParentChildHashMap.put(parentId, array)
                }
            } else {
                val array: ArrayList<String> = ArrayList()
                array.add(itemId!!)
                PackageOrderItemsActivity.ParentChildHashMap.put(parentId, array)
            }
        } else {
            if (PackageOrderItemsActivity.ParentChildHashMap.containsKey(parentId)) {
                val array = PackageOrderItemsActivity.ParentChildHashMap.get(parentId)
                if (array!!.contains(itemId)) {
                    array.remove(itemId)

                    if (array.isEmpty())
                        PackageOrderItemsActivity.ParentChildHashMap.remove(parentId)
                    else
                        PackageOrderItemsActivity.ParentChildHashMap.put(parentId, array)

                }
            }

        }

        Log.d("hashMap", PackageOrderItemsActivity.ParentChildHashMap.toString())

    }


}

А вот мой код для создания TreeView в Activity:

 fun populateTree() {
        val root = TreeNode.root()
        var parent: TreeNode? = null

//            val parent = TreeNode("parentList")
//            val child0 = TreeNode("secondList")
//            val child1 = TreeNode("thirdList")

        for (i in 0 until parentList.size) {
            var child1: TreeNode? = null
            var child2: TreeNode? = null

            val nodeItem = ParentListViewHolder.IconTreeItem()
            nodeItem.text = parentList.get(i)
            parent = TreeNode(nodeItem).setViewHolder(ParentListViewHolder(this@PackageOrderItemsActivity))

            for (j in 0 until secondList.size) {
                val nodeItem1 = SecondListViewHolder.IconTreeItem()
                nodeItem1.text = secondList.get(j)
                child1 = TreeNode(nodeItem1).setViewHolder(SecondListViewHolder(this@PackageOrderItemsActivity))
                parent.addChild(child1)

                if (thirdList.containsKey(secondList.get(j))) {

                    val list = thirdList.get(secondList.get(j))!!

                    Log.d("firstList", list.toString())
                    for (l in 0 until list.size) {
                        val nodeItem2 = ThirdListViewHolder.IconTreeItem()

                        nodeItem2.text = list.get(l)
                        nodeItem2.tag = i.toString() + "_" + j + "_" + l

                        if(firstTime) {
                            val checkListItem =
                                CheckListControl(i.toString(), j.toString(), l.toString(), list.get(l), false)
                            checkListControl.add(checkListItem)
                        }

                        for (m in 0 until checkListControl.size) {
                            val grandParentId = checkListControl.get(m).grandParentID
                            val parentId = checkListControl.get(m).parentID
                            val childId = checkListControl.get(m).childID
                            val isChecked = checkListControl.get(m).isChecked

                            if (grandParentId.equals(i.toString()) && parentId.equals(j.toString()) &&
                                childId.equals(l.toString())
                            ) {
                                nodeItem2.isChecked = isChecked
                            }
                        }

                        child2 =
                            TreeNode(nodeItem2).setViewHolder(
                                ThirdListViewHolder(
                                    this@PackageOrderItemsActivity, reloadView = {
                                        //  populateTree()
                                        // init()
                                        ParentChildHashMap.clear()
                                        parentList.clear()
                                        secondList.clear()
                                        thirdList.clear()
                                        container.removeAllViews()

                                        getSubscriptionDetails()
                                    })
                            )

                        child1.addChild(child2)
                        if (nodeItem2.isChecked) {
                            parent.isExpanded = true
                            child1.isExpanded = true
                        }

                    }
                }


            }
            firstTime = false
            root.addChild(parent)

        }



        tView = AndroidTreeView(this@PackageOrderItemsActivity, root)
        container.addView(tView!!.view)


    }

...