You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何用ViewModel同时获取多支股票数据并支持刷新?

请提供需要进行Markdown格式化的具体内容,我会严格按照你列出的规则处理。


若你是针对之前的Android股票对比功能ViewModel改造问题,以下是符合格式要求的解决方案:

多股票数据保留与单支刷新实现方案

核心改造方向

将ViewModel中的单支股票LiveData改为多股票集合的LiveData,同时为每支股票提供独立的刷新逻辑,确保添加新股票时保留原有数据,且支持单独刷新指定股票。

具体代码实现

1. 调整ViewModel数据结构

替换原有单支股票的LiveData为存储股票列表的LiveData,同时新增记录刷新状态的集合:

class StockViewModel : ViewModel() {
    // 存储所有已选择的股票列表,初始化为空 mutableList
    private val _stockList = MutableLiveData<MutableList<Stock>>(mutableListOf())
    val stockList: LiveData<List<Stock>> = _stockList

    // 记录正在刷新的股票代码,用于UI显示加载状态
    private val _refreshingTickers = MutableLiveData<Set<String>>(emptySet())
    val refreshingTickers: LiveData<Set<String>> = _refreshingTickers

    private val repository = StockRepository() // 假设已有后端API请求实现

2. 实现添加股票逻辑

添加新股票时先检查是否重复,避免同一股票多次加入:

fun addStock(ticker: String) {
        val currentList = _stockList.value ?: mutableListOf()
        // 检查当前列表是否已存在该股票
        if (currentList.any { it.ticker == ticker }) {
            return // 可在此处添加重复提示逻辑
        }

        viewModelScope.launch {
            try {
                _refreshingTickers.value = _refreshingTickers.value?.plus(ticker)
                val stock = repository.getStockDetails(ticker)
                currentList.add(stock)
                // 通知UI更新列表
                _stockList.value = currentList
            } catch (e: Exception) {
                Log.e("StockViewModel", "Error adding stock $ticker", e)
            } finally {
                _refreshingTickers.value = _refreshingTickers.value?.minus(ticker)
            }
        }
    }

3. 实现单支股票刷新逻辑

根据股票代码定位目标股票,重新获取数据并替换原有条目:

fun refreshStock(ticker: String) {
        viewModelScope.launch {
            try {
                _refreshingTickers.value = _refreshingTickers.value?.plus(ticker)
                val updatedStock = repository.getStockDetails(ticker)
                val currentList = _stockList.value?.toMutableList() ?: mutableListOf()
                // 找到对应股票的索引并替换
                val targetIndex = currentList.indexOfFirst { it.ticker == ticker }
                if (targetIndex != -1) {
                    currentList[targetIndex] = updatedStock
                    _stockList.value = currentList
                }
            } catch (e: Exception) {
                Log.e("StockViewModel", "Error refreshing stock $ticker", e)
            } finally {
                _refreshingTickers.value = _refreshingTickers.value?.minus(ticker)
            }
        }
    }

4. 可选:股票移除逻辑

如果需要支持删除对比列,可添加以下方法:

fun removeStock(ticker: String) {
        val currentList = _stockList.value?.toMutableList() ?: mutableListOf()
        currentList.removeIf { it.ticker == ticker }
        _stockList.value = currentList
    }
}

UI层适配要点

  • 观察stockList数据,根据列表长度动态生成对比列并展示股票详情
  • 观察refreshingTickers,对处于刷新状态的股票列显示加载动画
  • 点击“+”按钮时调用addStock方法,点击单支股票的刷新按钮时调用refreshStock方法

内容的提问来源于stack exchange,提问作者Pawandeep Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:46:11