如何在 Jetpack Compose 中创建具有静态值的可扩展列表视图
How to create expandable list view with static values in jetpack compose
我已经用静态值创建了 Kotlin 代码:
我想知道如何使用 Jetpack Compose 创建相同的内容?我不知道
代码:
class TestApp : AppCompatActivity() {
var listAdapter: ExpandableListAdapter? = null
var expListView: ExpandableListView? = null
var listDataHeader: MutableList<String>? = null
var listDataChild: HashMap<String, List<String>>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
expListView = findViewById<View>(R.id.lvExp) as ExpandableListView
prepareListData()
listAdapter = ExpandableListAdapter(this, listDataHeader, listDataChild)
expListView!!.setAdapter(listAdapter)
}
private fun prepareListData() {
listDataHeader = ArrayList()
listDataChild = HashMap()
listDataHeader?.add(getString(R.string.q_1))
val on_0: MutableList<String> = ArrayList()
on_0.add(getString(R.string.faq_d_0))
listDataChild!![listDataHeader!![0]] = on_0
}
}
您可以使用 LazyColumn
加上可变状态列表来存储折叠状态:
@Composable
fun CollapsableLazyColumn(
sections: List<CollapsableSection>,
modifier: Modifier = Modifier
) {
val collapsedState = remember(sections) { sections.map { true }.toMutableStateList() }
LazyColumn(modifier) {
sections.forEachIndexed { i, dataItem ->
val collapsed = collapsedState[i]
item(key = "header_$i") {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.clickable {
collapsedState[i] = !collapsed
}
) {
Icon(
Icons.Default.run {
if (collapsed)
KeyboardArrowDown
else
KeyboardArrowUp
},
contentDescription = "",
tint = Color.LightGray,
)
Text(
dataItem.title,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(vertical = 10.dp)
.weight(1f)
)
}
Divider()
}
if (!collapsed) {
items(dataItem.rows) { row ->
Row {
Spacer(modifier = Modifier.size(MaterialIconDimension.dp))
Text(
row,
modifier = Modifier
.padding(vertical = 10.dp)
)
}
Divider()
}
}
}
}
}
data class CollapsableSection(val title: String, val rows: List<String>)
const val MaterialIconDimension = 24f
用法:
CollapsableLazyColumn(
sections = listOf(
CollapsableSection(
title = "Fruits A",
rows = listOf("Apple", "Apricots", "Avocado")
),
CollapsableSection(
title = "Fruits B",
rows = listOf("Banana", "Blackberries", "Blueberries")
),
CollapsableSection(
title = "Fruits C",
rows = listOf("Cherimoya", "Cantaloupe", "Cherries", "Clementine")
),
),
)
结果:
我已经用静态值创建了 Kotlin 代码:
我想知道如何使用 Jetpack Compose 创建相同的内容?我不知道
代码:
class TestApp : AppCompatActivity() {
var listAdapter: ExpandableListAdapter? = null
var expListView: ExpandableListView? = null
var listDataHeader: MutableList<String>? = null
var listDataChild: HashMap<String, List<String>>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
expListView = findViewById<View>(R.id.lvExp) as ExpandableListView
prepareListData()
listAdapter = ExpandableListAdapter(this, listDataHeader, listDataChild)
expListView!!.setAdapter(listAdapter)
}
private fun prepareListData() {
listDataHeader = ArrayList()
listDataChild = HashMap()
listDataHeader?.add(getString(R.string.q_1))
val on_0: MutableList<String> = ArrayList()
on_0.add(getString(R.string.faq_d_0))
listDataChild!![listDataHeader!![0]] = on_0
}
}
您可以使用 LazyColumn
加上可变状态列表来存储折叠状态:
@Composable
fun CollapsableLazyColumn(
sections: List<CollapsableSection>,
modifier: Modifier = Modifier
) {
val collapsedState = remember(sections) { sections.map { true }.toMutableStateList() }
LazyColumn(modifier) {
sections.forEachIndexed { i, dataItem ->
val collapsed = collapsedState[i]
item(key = "header_$i") {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.clickable {
collapsedState[i] = !collapsed
}
) {
Icon(
Icons.Default.run {
if (collapsed)
KeyboardArrowDown
else
KeyboardArrowUp
},
contentDescription = "",
tint = Color.LightGray,
)
Text(
dataItem.title,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(vertical = 10.dp)
.weight(1f)
)
}
Divider()
}
if (!collapsed) {
items(dataItem.rows) { row ->
Row {
Spacer(modifier = Modifier.size(MaterialIconDimension.dp))
Text(
row,
modifier = Modifier
.padding(vertical = 10.dp)
)
}
Divider()
}
}
}
}
}
data class CollapsableSection(val title: String, val rows: List<String>)
const val MaterialIconDimension = 24f
用法:
CollapsableLazyColumn(
sections = listOf(
CollapsableSection(
title = "Fruits A",
rows = listOf("Apple", "Apricots", "Avocado")
),
CollapsableSection(
title = "Fruits B",
rows = listOf("Banana", "Blackberries", "Blueberries")
),
CollapsableSection(
title = "Fruits C",
rows = listOf("Cherimoya", "Cantaloupe", "Cherries", "Clementine")
),
),
)
结果: