Android 当我使用LiveData时,为什么还需要启动notifyDataSetChanged()?
我在学习室里学习项目示例RoomWordsSample 以下代码来自该项目 在我看来,如果观察到数据发生变化,LiveDate将自动更新UI 但是在WordListAdapter.kt文件中,我发现notifyDataSetChanged被添加到函数setWord剑士:List中,似乎它必须在数据更改时手动通知UI 当我使用LiveData时,为什么它仍然需要启动notifyDataSetChanged MainActivity.kt WordViewModel.kt WordListAdapter.kt notifyDataSetChanged与LiveData无关,它是RecyclerViewAPI的一部分 LiveData—是以生命周期感知的方式接收数据的方式,RecyclerView只显示视图。notifyDataSetChanged与LiveData无关,它是RecyclerView api的一部分Android 当我使用LiveData时,为什么还需要启动notifyDataSetChanged()?,android,kotlin,android-livedata,android-jetpack,Android,Kotlin,Android Livedata,Android Jetpack,我在学习室里学习项目示例RoomWordsSample 以下代码来自该项目 在我看来,如果观察到数据发生变化,LiveDate将自动更新UI 但是在WordListAdapter.kt文件中,我发现notifyDataSetChanged被添加到函数setWord剑士:List中,似乎它必须在数据更改时手动通知UI 当我使用LiveData时,为什么它仍然需要启动notifyDataSetChanged MainActivity.kt WordViewModel.kt WordListAdapt
LiveData—是一种以生命周期感知方式接收数据的方式,RecyclerView只显示视图。实际上,LiveData将在您的活动中为您提供更新的数据。但是现在,更新ui是活动的工作。因此,无论何时live data向您提供更新的数据,您都必须告诉ui更新数据。因此,notifyDataSetChanged。实际上,livedata将在活动中为您提供更新的数据。但是现在,更新ui是活动的工作。因此,无论何时live data向您提供更新的数据,您都必须告诉ui更新数据。因此,NotifyDataSetChange。谢谢!如果我希望当livedata更改时,recyclerView UI自动显示最新数据,我如何修改代码?谢谢!如果我希望在livedata更改时,recyclerView UI自动显示最新数据,那么如何修改代码?
class MainActivity : AppCompatActivity() {
private val newWordActivityRequestCode = 1
private lateinit var wordViewModel: WordViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
val adapter = WordListAdapter(this)
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)
wordViewModel = ViewModelProvider(this).get(WordViewModel::class.java)
wordViewModel.allWords.observe(this, Observer { words ->
words?.let { adapter.setWords(it) }
})
}
}
class WordViewModel(application: Application) : AndroidViewModel(application) {
private val repository: WordRepository
val allWords: LiveData<List<Word>>
init {
val wordsDao = WordRoomDatabase.getDatabase(application, viewModelScope).wordDao()
repository = WordRepository(wordsDao)
allWords = repository.allWords
}
fun insert(word: Word) = viewModelScope.launch {
repository.insert(word)
}
}
class WordListAdapter internal constructor(
context: Context
) : RecyclerView.Adapter<WordListAdapter.WordViewHolder>() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
private var words = emptyList<Word>() // Cached copy of words
inner class WordViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val wordItemView: TextView = itemView.findViewById(R.id.textView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WordViewHolder {
val itemView = inflater.inflate(R.layout.recyclerview_item, parent, false)
return WordViewHolder(itemView)
}
override fun onBindViewHolder(holder: WordViewHolder, position: Int) {
val current = words[position]
holder.wordItemView.text = current.word
}
internal fun setWords(words: List<Word>) {
this.words = words
notifyDataSetChanged()
}
override fun getItemCount() = words.size
}