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
相关产品推荐
相关产品推荐

