效果圖
只能實現(xiàn)兩層折疊袖瞻。
image.png
屬性簡單介紹
divider :父布局之間的分割線樣式
childDivider :子布局之間分割樣式
dividerHeight :用于設置分割線的高度
childIndicator :用于設置子布局前顯示的圖標,不設置的話默認是沒有圖標的
groupIndicator :設置父布局前顯示的圖標
indicatorLeft/indicatorStart :默認圖標距左側距離
indicatorRight/indicatorEnd :默認圖標距右側距離
使用詳解
- 主界面
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ExpandableListView
android:id="@+id/elvExpandList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:groupIndicator="@null"/>
</androidx.constraintlayout.widget.ConstraintLayout>
- activity
class ExpandActivity: AppCompatActivity(R.layout.activity_expand) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initData()
}
lateinit var adapter: ExpandAdapter
private fun initData() {
val list = ArrayList<Contact>()
var contact: Contact
for (i in 0..8){
contact = Contact("朋友$i",
arrayListOf(
Person("張三","123658956987"),
Person("李四","123658956987"),
Person("王五","123658956987")
))
list.add(contact)
}
adapter = ExpandAdapter(this,list)
elvExpandList.setAdapter(adapter)
//默認展開第幾個
elvExpandList.expandGroup(3)
//子布局點擊
elvExpandList.setOnChildClickListener { parent, v, groupPosition, childPosition, id ->
Toast.makeText(this, "${list[groupPosition].list[childPosition].name}", Toast.LENGTH_SHORT).show()
true
}
}
}
- bean
data class Contact(
var title: String?,
var list: List<Person>
)
data class Person(var name: String?, var phone: String?)
- adpter
class ExpandAdapter(val context: Context, private val list: List<Contact>) :
BaseExpandableListAdapter() {
var layoutInflater: LayoutInflater = LayoutInflater.from(context)
override fun getGroupCount(): Int = list.size
override fun getChildrenCount(groupPosition: Int): Int = list[groupPosition].list.size
override fun getGroup(groupPosition: Int): Any {
return list[groupPosition]
}
override fun getChild(groupPosition: Int, childPosition: Int): Any {
return list[groupPosition].list[childPosition]
}
override fun getGroupId(groupPosition: Int): Long {
return groupPosition.toLong()
}
override fun getChildId(groupPosition: Int, childPosition: Int): Long {
return childPosition.toLong()
}
override fun hasStableIds(): Boolean = false
override fun getGroupView(
groupPosition: Int,
isExpanded: Boolean,
convertView: View?,
parent: ViewGroup?
): View {
var convertView = convertView
val holder: GroupViewHolder
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_expand_group, parent, false)
holder = GroupViewHolder(convertView)
convertView.tag = holder
} else {
holder = convertView.tag as GroupViewHolder
}
val groupData = list[groupPosition]
holder.tvTitle.text = groupData.title
holder.ivArrow.setImageResource(if (isExpanded) R.drawable.arrow_down else R.drawable.arrow_right)
return convertView!!
}
override fun getChildView(
groupPosition: Int,
childPosition: Int,
isLastChild: Boolean,
convertView: View?,
parent: ViewGroup?
): View {
var convertView = convertView
val holder: ChildViewHolder
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_expand_child, parent, false)
holder = ChildViewHolder(convertView!!)
convertView.tag = holder
} else {
holder = convertView.tag as ChildViewHolder
}
val childData = list[groupPosition].list[childPosition]
holder.tvName.text = childData.name
holder.tvMoblie.text = childData.phone
return convertView
}
//子項是否可選中,如果要設置子項的點擊事件,需要返回true
override fun isChildSelectable(groupPosition: Int, childPosition: Int): Boolean = true
/* internal class TestViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var tvTitle: TextView = itemView.findViewById(R.id.tvItemExpandGroupTitle)
}*/
class GroupViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var tvTitle: TextView = itemView.findViewById<TextView>(R.id.tvItemExpandGroupTitle)
var ivArrow: ImageView = itemView.findViewById<ImageView>(R.id.ivExpandGroupArrow)
}
class ChildViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var tvName = itemView.findViewById<TextView>(R.id.tvItemExpandChildName)
var tvMoblie = itemView.findViewById<TextView>(R.id.tvItemExpandChildPhone)
}
}
- 外層 Item 布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingHorizontal="15dp">
<TextView
android:id="@+id/tvItemExpandGroupTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分組"
android:layout_centerVertical="true"/>
<ImageView
android:id="@+id/ivExpandGroupArrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/arrow_right"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
- 內層 item 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorAccent">
<TextView
android:id="@+id/tvItemExpandChildName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_gravity="center_vertical"
android:layout_marginStart="50dp"
android:textColor="@color/white"/>
<TextView
android:id="@+id/tvItemExpandChildPhone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_gravity="center_vertical"
android:layout_marginStart="20dp"
android:textColor="@color/white"/>
</LinearLayout>