我正在尝试将体育 API 数据添加到类别列表中,以与可滚动的 tabrow 同步,但该列表始终为空,仅显示标题和图标,而不显示 API 数据。该应用程序可以与虚拟列表完美配合,但从 API 添加时情况并非如此。
我附上了一些代码示例以使其显而易见。 希望我能解释清楚,有人可以给出答案。
列表视图模型
class ListViewModel: ViewModel() {
val tournamentItemList: MutableList<Category>
get() = items
private val items = mutableStateListOf<Category>()
fun addTournamentItem(item: Category){
items.add(item)
}
}
获取数据
@Composable
fun GetData(
team: TeamStatsResponse, rankList: List<StandingsItemItem?>
) {
val data: ArrayList<Int> = ArrayList(3)
val viewModel: TournamentStateViewModel = viewModel()
viewModel.addTournamentItem(
Category(
"Standings",
Icons.Default.TableRows,
onClick = {},
data.forEach {
TopTeamsPoints(
rankList[it]!!.rank!!,
rankList[it]!!.team!!.logo!!,
rankList[it]!!.team!!.name!!,
rankList[it]!!.all!!.played!!,
rankList[it]!!.all!!.win!!,
rankList[it]!!.all!!.draw!!,
rankList[it]!!.all!!.lose!!,
rankList[it]!!.points!!
)
}
)
)
viewModel.addTournamentItem(
Category(
"Clean Sheets",
Icons.Default.CleaningServices,
onClick = {},
data.forEach {
TopTeamsClean(
1, team.team!!.logo!!,
team.team.name!!, team.fixtures!!.played!!.total!!,
team.cleanSheet!!.total!!
)
}
)
)
etc...
}
获取数据
fun FetchData(
mainViewModel: MainViewModel = hiltViewModel()
) {
when(
val stateA = mainViewModel.pLStandings.collectAsState().value
) {
is PLStandingsState.Empty -> {
Text(text = "No data available")
}
is PLStandingsState.Loading -> {
Text(text = "Loading...")
}
is PLStandingsState.Error -> {
Text(text = stateA.message)
}
is PLStandingsState.Success -> {
when(val stateB = mainViewModel.leagueStatsState.collectAsState().value) {
is LeagueStatsState.Empty -> {
Text(text = "No data available")
}
is LeagueStatsState.Loading -> {
Text(text = "Loading...")
}
is LeagueStatsState.Error -> {
Text(text = stateB.message)
}
is LeagueStatsState.Success -> {
GetData(team = stateB.teamData, rankList = stateA.data)
}
}
}
}
}
@Preview
@Composable
fun TabSyncCompose() {
val context = LocalContext.current
val viewModel: TournamentStateViewModel = viewModel()
val list = viewModel.tournamentItemList
if (list.isNotEmpty()) {
TabSyncComposeScreen(list)
} else {
//This toast always appears
Toast.makeText(context, "Empty", Toast.LENGTH_SHORT).show()
}
}
好的,在上面所附的代码示例中,无需任何编辑,数据已成功从 API 获取并成功添加到列表中。真正的问题是 3 个整数的“data”数组列表。虽然 API 想要的项目只有 3 个,但不需要循环。对我来说,删除“add”和“foreach{}”块后,现在一切都运行良好。
viewModel.addTournamentItem(
Category(
"Standings",
Icons.Default.TableRows,
onClick = {},
TopTeamsPoints(
rankList[0]!!.rank!!,
rankList[0]!!.team!!.logo!!,
rankList[0]!!.team!!.name!!,
rankList[0]!!.all!!.played!!,
rankList[0]!!.all!!.win!!,
rankList[0]!!.all!!.draw!!,
rankList[0]!!.all!!.lose!!,
rankList[0]!!.points!!
)
etc...
)
)