#java #android #kotlin #treeview #radio-group
#java #Android #kotlin #просмотр дерева #радиогруппа
Вопрос:
Я застрял в ситуации, когда мне приходится использовать 3-уровневый расширяемый список, а на самом низком уровне / 3 уровня будет радиогруппа. 2-й уровень может иметь несколько подуровней. Другими словами, 2-й уровень может иметь несколько дочерних элементов.
Я пробовал расширять представление списка внутри представления переработчика, но поскольку представление переработчика увеличивает представление в onCreateView. Я не могу изменить размер представления в OnBindHolder. Аналогичная проблема с ExpandableListView внутри ExpandableListView.
Я попробовал библиотеку AndroidTreeView. https://github.com/bmelnychuk/AndroidTreeView
Это отлично работает для флажков, поскольку мне не нужно обрабатывать проверки других полей. Но в случае переключателей. Я не могу создать радиогруппу, чтобы на 3-м уровне одновременно выбирался только один элемент. Поскольку у меня нет контроля над другими переключателями.
Я попытался изменить класс 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]) amp;amp; parentID.equals(getTag[1]) amp;amp; 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()) amp;amp; parentId.equals(j.toString()) amp;amp;
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)
}
Комментарии:
1. Спасибо за ссылку! Я пытался github.com/thoughtbot/expandable-recycler-view , но есть только два уровня, но вы можете видеть, как они работают с радиокнопками. Проект старый, поэтому требуется некоторое время для обновления, если это необходимо.
2. Я обновил его, и если вы хотите этот архив, я отправлю.
3. Да, пожалуйста, отправьте его. Это было бы здорово.
5. Добро пожаловать! Со второй попытки я смог установить AndroidTreeView. Большое вам спасибо за ссылку!