- 大致思路
使用RecyclerView嵌套RecyclerView的方式实现很明显是不现实的,不仅会有滑动冲突,而且消耗资源,网上寻找了大量的轮子也没有找到合适的,索性自己硬着头皮写了一个。
实现思路是动态插入,要求的数据格式如下:
[{
"list1": "list",
"child": [{
"child1": "child1"
},
{
"child2": "child2"
}, {
"child3": "child3"
}
]
}
]
一级列表中包含二级列表
- 打开一级列表方法
bean是上述的childList中二级列表数组,position是点击的Item的下标,size是bean的长度,isScroll是如果点击的屏幕中最下面的那个一个,是否将二级列表中的第一个自动滚动进屏幕,以免用户以为列表打开失败
fun addData(bean: MutableList<Bean>, position: Int, size: Int, isScroll: Boolean = true) {
for (i in 0 until size) {
add(bean[i], position + 1 + i)
}
if (isScroll) {
//等于空代表Item不可见,在屏幕外,就移动进屏幕
if (recyclerView.layoutManager?.findViewByPosition(position + 1)?.getGlobalVisibleRect(Rect()) == null) {
recyclerView.scrollToPosition(position + 1)
}
}
}
- add方法,L就是一个泛型,就是你所使用的数据类型
open fun add(data: L, index: Int = -1) {
if (index != -1) {
l.add(index, data)
notifyItemInserted(index)
notifyItemRangeChanged(index, itemCount)
} else {
l.add(data)
notifyItemInserted(l.size)
notifyItemRangeChanged(l.size, itemCount)
}
}
- 关闭一级列表方法
position同上,size也同上,是childList的长度
private fun hideData(position: Int, size: Int) {
val intList = mutableListOf<Int>()
for (i in 0 until size) {
intList.add((position + 1 + i))
}
remove(intList) {
}
}
批量使用下标移除方法
list是待移除的下标集合
open fun remove(list: MutableList<Int>) {
list.sortWith(Comparator { o1, o2 ->
return@Comparator Integer.compare(o1, o2)
})
for (i in 0 until list.size) {
var posi = list[i]
posi -= i
remove(posi) {}
}
}
以上就是大概实现思路,如果有问题评论告诉我哦~
顺利使用的老铁帮点个赞,谢谢啦~
网友评论