如何使用Room Library Android在文本视图中显示数据?

如何使用Room Library Android在文本视图中显示数据?,android,kotlin,Android,Kotlin,我是Android新手。我正在开发一个应用程序,一个接一个地显示10个单词及其含义。我的问题是如何从包含LiveData>variable的模型视图到文本视图逐个显示数据。 这个过程应该是这样的:将数据从数据库检索到存储库以查看模型,最后在UI文本视图中显示它。除了使用“回收视图”之外,还有其他建议吗 @Dao 接口WordDao{ @查询(“从word_表中选择*) fun getWords():流 classwordrepository(私有val-wordDao:wordDao){ va

我是Android新手。我正在开发一个应用程序,一个接一个地显示10个单词及其含义。我的问题是如何从包含LiveData>variable的模型视图到文本视图逐个显示数据。 这个过程应该是这样的:将数据从数据库检索到存储库以查看模型,最后在UI文本视图中显示它。除了使用“回收视图”之外,还有其他建议吗

@Dao
接口WordDao{
@查询(“从word_表中选择*)
fun getWords():流
classwordrepository(私有val-wordDao:wordDao){
val-allWords:Flow=wordDao.getWords()
}

类WordViewModel(专用val存储库:WordRepository):ViewModel(){
val-allWords:LiveData=repository.allWords.asLiveData()
}
}

您可以将
所有单词流与跟踪列表中显示的元素的流相结合,并使用它们生成单个单词流。然后创建一个单独的公共函数来增加单词索引

class WordViewModel(private val repository: WordRepository) : ViewModel() {

    private val wordIndex = MutableStateFlow(0)
    val word: LiveData<Word> = repository.allWords.combine(wordIndex) { list, index -> 
        list[index % list.size] // % operator allows wrap-around
    }.asLiveData()

    fun incrementWord() {
        wordIndex.value += 1
    }
  
}
类WordViewModel(私有val存储库:WordRepository):ViewModel(){
private val wordIndex=MutableStateFlow(0)
val-word:LiveData=repository.allWords.combine(wordIndex){列表,索引->
list[索引%list.size]/%运算符允许换行
}.asLiveData()
fun incrementWord(){
wordIndex.value+=1
}
}
然后在片段/活动中,观察LiveData并使用该值设置TextView的文本。并使Next按钮调用ViewModel的
incrementWord()
函数

如果您还想在此ViewModel处于活动状态时添加和删除单词,这可能会变得有点棘手,因为添加或删除单词将更改当前显示的单词,并且可能会跳过旋转中的单词。

在UI活动中写入:

val txt1=findViewById<TextView>(R.id.textView1)
val txt2=findViewById<TextView>(R.id.textView2)

val wordViewModel: LiveData<List<Word>> = wordViewModel.allWords

wordViewModel.allWords.observe(this) { words ->
           
              txt1.text=words[1].word
              txt2.text=words[2].word
   
        }
val txt1=findViewById(R.id.textView1)
val txt2=findViewById(R.id.textView2)
val wordViewModel:LiveData=wordViewModel.allWords
wordViewModel.allWords.observe(这个){words->
txt1.text=单词[1]。单词
txt2.text=单词[2]。单词
}

感谢您的回答,我应用了您的解决方案,但在“combine”上出现了一个错误,说明没有足够的信息来推断变量R。第二个错误结束(wordIndex)说明“没有为参数“transform”传递值”“。这是针对第一个错误的建议:kotlinx.coroutines.flow FlowKt.class@JvmName public fun flow.combine(flow:flow,transform:suspend(T1,T2)→ R):Flow返回一个流,该流的值是通过组合每个流最近发出的值来使用transform函数生成的。它可以用以下示例演示:val flow=flowOf(1,2)。onEach{delay(10)}val flow2=flowOf(“a”,“b”,“c”)。onEach{delay(15)}flow.combine(flow2){i,s->i.toString()+s}。collect{println(It)//将打印“1a2a2b2b2b2c”}此函数是flow的简写。combineTransform(flow2){,b->emit(transform(transform,a,b))}对不起,我忘了,
combine
使用变换函数。参见编辑。我还应该提到,由于SharedFlow和StateFlow,我认为LiveData最终将被认为在Kotlin中使用过时。因此,您不必使用
asLiveData()
,而可以使用
shareIn
并按此处所述订阅它:只是一个预测,此时无需担心它。
class WordRepository(private val wordDao: WordDao) {
  
    val allWords: Flow<List<Word>> = wordDao.getWords()
  
    }


class WordViewModel(private val repository: WordRepository) : ViewModel() {
   
    val allWords: LiveData<List<Word>> = repository.allWords.asLiveData()
  
    }
}
class WordViewModel(private val repository: WordRepository) : ViewModel() {

    private val wordIndex = MutableStateFlow(0)
    val word: LiveData<Word> = repository.allWords.combine(wordIndex) { list, index -> 
        list[index % list.size] // % operator allows wrap-around
    }.asLiveData()

    fun incrementWord() {
        wordIndex.value += 1
    }
  
}
val txt1=findViewById<TextView>(R.id.textView1)
val txt2=findViewById<TextView>(R.id.textView2)

val wordViewModel: LiveData<List<Word>> = wordViewModel.allWords

wordViewModel.allWords.observe(this) { words ->
           
              txt1.text=words[1].word
              txt2.text=words[2].word
   
        }