尝试将使用 Retrofit2 获取的 API 数据存储在 mutableList 中,返回空列表

问题描述 投票:0回答:1

我正在尝试将体育 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()
    }
}
android android-jetpack-compose retrofit2 android-viewmodel
1个回答
0
投票

好的,在上面所附的代码示例中,无需任何编辑,数据已成功从 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...
        )
    )
© www.soinside.com 2019 - 2024. All rights reserved.