Я застрял в ситуации, когда мне нужно использовать расширяемый список 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)
}