Создание ExpandelbeListView, где каждый элемент - ExpandelbeListView в android
Мне нужно создать расширяющийся список, где каждый элемент внешнего списка - будет расширяющимся списком, а каждый элемент внутреннего - строкой.
Я написал 2 адаптера(скорее всего, можно и нужно было обойтись 1м,но сложно понять пока), первый - на внешний и второй на внутренний списки, соответственно.
Проблема в том, что по нажатию на элемент внешнего списка - он не расширяется, хотя, если из мэйнАктивити сделать адаптер этого типа, то он работает.
Последний лист в череде пар листа groups содержит всего 3 элемента, поэтому просто через when выбираю нужный текст для вывода в втором адаптере
Код адаптера на внешний список:
class ExpExpListAdapter(private val context: Context, private val groups: MutableList<Pair<String, MutableList<Pair<String, MutableList<String>>>>>): BaseExpandableListAdapter() {
override fun getGroupCount(): Int = groups.size
override fun getChildrenCount(groupPosition: Int): Int = groups[groupPosition].second.size
override fun getGroup(groupPosition: Int): Any = groups[groupPosition].second
override fun getChild(groupPosition: Int, childPosition: Int): Any = groups[groupPosition].second[childPosition].first
override fun getGroupId(groupPosition: Int): Long = groupPosition.toLong()
override fun getChildId(groupPosition: Int, childPosition: Int): Long = childPosition.toLong()
override fun hasStableIds(): Boolean = true
@SuppressLint("SetTextI18n")
override fun getGroupView(groupPosition: Int, isExpanded: Boolean, convertView: View?, parent: ViewGroup?): View {
var viewCopy = convertView
if (viewCopy == null){
val layoutInflater:LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
viewCopy = layoutInflater.inflate(R.layout.list_group,null)
}
val groupTitle = viewCopy?.findViewById<TextView>(R.id.listTitle)
groupTitle?.text = "Номер вагона - ${groups[groupPosition].first}"
return viewCopy!!
}
@SuppressLint("SetTextI18n")
override fun getChildView(groupPosition: Int, childPosition: Int, isLastChild: Boolean, convertView: View?, parent: ViewGroup?): View? {
var viewCopy = convertView
if (viewCopy == null){
val layoutInflater :LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
viewCopy = layoutInflater.inflate(R.layout.expandes,null)
}
val childExList = convertView?.findViewById<ExpandableListView>(R.id.exListView)
childExList?.setAdapter(ExpListAdapter(context, groups[groupPosition].second))
return viewCopy
}
override fun isChildSelectable(p0: Int, p1: Int): Boolean = true
}
На внутренний:
class ExpListAdapter(private val context: Context, private val groups:MutableList<Pair<String,MutableList<String>>>): BaseExpandableListAdapter() {
override fun getGroupCount(): Int = groups.size
override fun getChildrenCount(groupPosition: Int): Int = 3
override fun getGroup(groupPosition: Int): Any = groups[groupPosition].second
override fun getChild(groupPosition: Int, childPosition: Int): Any = groups[groupPosition].second[childPosition]
override fun getGroupId(groupPosition: Int): Long = groupPosition.toLong()
override fun getChildId(groupPosition: Int, childPosition: Int): Long = childPosition.toLong()
override fun hasStableIds(): Boolean = true
@SuppressLint("SetTextI18n")
override fun getGroupView(groupPosition: Int, isExpanded: Boolean, convertView: View?, parent: ViewGroup?): View {
var viewCopy = convertView
if (viewCopy == null){
val layoutInflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
viewCopy = layoutInflater.inflate(R.layout.list_group,null)
}
val groupTitle = viewCopy?.findViewById<TextView>(R.id.listTitle)
groupTitle?.text = "Номер колесной пары - ${groups[groupPosition].first}"
return viewCopy!!
}
@SuppressLint("SetTextI18n")
override fun getChildView(groupPosition: Int, childPosition: Int, isLastChild: Boolean, convertView: View?, parent: ViewGroup?): View? {
var viewCopy = convertView
if (viewCopy == null){
val layoutInflater : LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
viewCopy = layoutInflater.inflate(R.layout.list_item,null)
}
val childText= viewCopy?.findViewById<TextView>(R.id.expandedListItem)
when(childPosition){
0-> childText?.text = "Позиция: ${groups[groupPosition].second[childPosition]}"
1-> childText?.text = "Пробег ПР: ${groups[groupPosition].second[childPosition]}"
2-> childText?.text = "Общий пробег: ${groups[groupPosition].second[childPosition]}"
}
return viewCopy
}
override fun isChildSelectable(p0: Int, p1: Int): Boolean = true
}
Ответы (1 шт):
Необходимо было добавить собственную реализацию класса ExpandebleListView и программно задавать дочерние элементы внешнего адаптера без привязки к rootView
Код класса экспандблЛистВью -
class CustomExpListView(context: Context?) : ExpandableListView(context) {
override fun onMeasure(width: Int, height: Int) {
val widthMeasureSpec: Int = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST)
val heightMeasureSpec: Int = MeasureSpec.makeMeasureSpec(20000, MeasureSpec.AT_MOST)
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
}