1.Kotlin 實作可擴展二級串列效果如下
2.activity_list.xml,布局代碼如下:
......
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/mRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bgColorSecondary"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
......
3.MainActivity.kt
......
var nodeAdapter = StatisticsAdapter()
mRecyclerView.adapter = nodeAdapter
nodeAdapter.setList(nodelist)
......
var groups = getGroups()
groups.forEach {
//設定item node
setItemNode(it)
}
......
private fun setItemNode(groupName: String) {
val items: MutableList<BaseNode> = mutableListOf()
if (groupName.contains("統計1")) {
var s = StatisticsNode("辦公室統計", "1", null)
items.add(s);
s = StatisticsNode("宿舍統計", "2", null)
items.add(s)
s = StatisticsNode("教室統計", "3", null)
items.add(s)
val entity = RootNode(items, groupName)
nodelist.add(entity)
}
if (groupName.contains("統計2")) {
var s = StatisticsNode("食堂統計", "4", null)
items.add(s);
s = StatisticsNode("超市統計", "5", null)
items.add(s);
s = StatisticsNode("物業室統計", "6", null)
items.add(s);
val entity = RootNode(items, groupName)
nodelist.add(entity)
}
}
private fun getGroups(): ArrayList<String> {
var groupName = arrayListOf<String>()
groupName.add("統計1")
groupName.add("統計2")
return groupName
}
......
3.1 StatisticsAdapter.kt

3.1.1 RootNodeProvider.kt,點擊item
override fun onClick(helper: BaseViewHolder, view: View, data: BaseNode, position: Int) {
getAdapter()!!.expandOrCollapse(position)
}

3.1.2 StatisticsNodeProvider.kt
override fun onClick(helper: BaseViewHolder, view: View, data: BaseNode, position: Int) {
val entity: StatisticsNode = data as StatisticsNode
if ("2" == entity.classity) {
val intent = Intent(MyApplication.context, StatisticsActivity::class.java)
context?.startActivity(intent)
}
}

4.activity_expandable_listview.xml,這是擴展二級串列的
......
<ExpandableListView
android:id="@+id/elvContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:groupIndicator="@null" />
......
5.StatisticsActivity.kt
5.1
fun initView() {
adapter = DetailExpandableListAdapter(this)
elvContent.setAdapter(adapter)
}
5.2 可以自己設定資料,注意:必須要有規律,代碼(注釋說明)如下
fun initDatas() {
//"1"表示標題
var sc = SitCode(1, "1", "一棟宿舍");list.add(sc)
//"1A"表示第一組
sc = SitCode(2, "1A", "宿舍2001");list.add(sc)
//"1AA","1AB","1AC","1AD"表示子選項
sc = SitCode(3, "1AA", "小紅");list.add(sc)
sc = SitCode(4, "1AB", "小彬");list.add(sc)
sc = SitCode(5, "1AC", "小強");list.add(sc)
sc = SitCode(6, "1AD", "小紅");list.add(sc)
//"1B"表示第二組
sc = SitCode(7, "1B", "宿舍2002");list.add(sc)
//"1BA","1BB"表示子選項
sc = SitCode(8, "1BA", "小可");list.add(sc)
sc = SitCode(9, "1BB", "小雪");list.add(sc)
sc = SitCode(10, "1BC", "小飛");list.add(sc)
//"1C"表示第三組
sc = SitCode(11, "1C", "宿舍2003");list.add(sc)
//"1CA","1CB","1CC"表示子選項
sc = SitCode(12, "1CA", "小和");list.add(sc)
sc = SitCode(13, "1CB", "小楊");list.add(sc)
sc = SitCode(14, "1CC", "小一");list.add(sc)
//"1D"表示第四組
sc = SitCode(15, "1D", "宿舍2004");list.add(sc)
//"2"表示標題
sc = SitCode(16, "2", "二棟宿舍");list.add(sc)
//"2A"表示第五組
sc = SitCode(17, "2A", "宿舍2005");list.add(sc)
//"2B"表示第六組
sc = SitCode(18, "2B", "宿舍2006");list.add(sc)
//"2BA","2BB","1CC"表示子選項
sc = SitCode(19, "2BA", "小山");list.add(sc)
sc = SitCode(20, "2BB", "小梅");list.add(sc)
//"2C"表示第七組
sc = SitCode(21, "2C", "宿舍2007");list.add(sc)
//"3"表示標題
sc = SitCode(22, "3", "三棟宿舍");list.add(sc)
//"3A"表示第八組
sc = SitCode(23, "3A", "宿舍2008");list.add(sc)
//"3B"表示第九組
sc = SitCode(24, "3B", "宿舍2009");list.add(sc)
//"3C"表示第十組
sc = SitCode(25, "3C", "宿舍2010");list.add(sc)
//"4"表示標題
sc = SitCode(26, "4", "四棟宿舍");list.add(sc)
......
5.2.1 我做開發時就用sqlite資料庫上設定資料比較好,需要和SQL Server一致,如下圖

如何用代碼獲取sqlite資料庫的資料,你需要的話,可以點擊
Kotlin開發 如何獲取SQLite資料庫上自己創建規律的可擴展二級串列資料
5.3 代碼(注釋說明)如下
......
for (sitcode in list) {
val code = sitcode.code
//如果code是“1”或者“1A”或者“1AB”
when (code.length) {
//組資料給groups,groups包括有標題和組
//"1"的長度是1就給groups賦值
1 -> groups.add(sitcode)
//"1A"的長度是2就給groups賦值
2 -> groups.add(sitcode)
else -> {
//1AB(子選項)的長度是3就給對應的group賦值
val groupCode = code.substring(0, 2)
var childs = groupChilds[groupCode]
if (childs == null) {
childs = ArrayList()
groupChilds[groupCode] = childs
}
childs.add(sitcode)
}
}
}
......
5.4 獲取指定組位置處的組資料
override fun getGroupView(groupPosition: Int, isExpanded: Boolean, convertView: View?, parent: ViewGroup?): View {
var convertView = convertView
var viewHolder: ViewHolder = ViewHolder.getViewHolder(inflater, convertView, parent, R.layout.item_ser_detail)
val sitCode = getGroup(groupPosition)
convertView = viewHolder.convertView
val iv: ImageView = viewHolder.getView(R.id.iv_ser) as ImageView
//如果sitCode.code=“1A”(組)
if (sitCode.code.length == 2){
//如果“1A”有子選項“1AA”
if (list[sitCode.id].code.length == 3 ){
//把箭頭開了
iv.visibility = View.VISIBLE
}
}else{
//如果“1A”沒有子選項,箭頭就隱去
iv.visibility = View.GONE
}
iv.setImageResource(R.mipmap.ic_arrow_down)
if (!isExpanded) {
iv.setImageResource(R.mipmap.ic_arrow_right)
}
convertView.setBackgroundResource(
if (sitCode.code.length == 1)
R.drawable.alert_info_shap
else
R.color.white
)
val NameTv: TextView = viewHolder.getView(R.id.tv_ser_name)
val paddingDip = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
12f,
PhoneU.getScreenPix(context)
).toInt()
NameTv.setPadding(paddingDip, paddingDip, paddingDip, paddingDip)
NameTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f)
var text = ""
if (sitCode.code.length == 1) {
text = sitCode.name
} else if (sitCode.code.length == 2) {
text = sitCode.name
}
viewHolder.setText(R.id.tv_ser_name, text)
viewHolder.setTextColor(R.id.tv_ser_name, Color.RED)
return convertView
}

5.5 該方法決定每個子選項的外觀
override fun getChildView(groupPosition: Int, childPosition: Int, isLastChild: Boolean,
convertView: View?, parent: ViewGroup?): View {
var convertView = convertView
val viewHolder: ViewHolder = ViewHolder.getViewHolder(inflater, convertView, parent, R.layout.item_ser_detail)
convertView = viewHolder.convertView
convertView.setBackgroundResource(R.color.white)
val NameTv: TextView = viewHolder.getView(R.id.tv_ser_name)
......
val Code = getChild(groupPosition, childPosition)
viewHolder.setText(R.id.tv_ser_name, Code?.name)
return convertView
}

5.6 源代碼zip下載:
下載源代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290691.html
標籤:其他
