Android Recyclerview OnBindViewHolder仅在滚动时更新ui
当我打开应用程序时,“保存图像视图”处于工作状态,但当我单击“保存”时,它不会更新“保存图像视图”,它仅在我滚动“回收视图”并滚动回该位置时才工作 我使用房间数据库更新recycler视图项目(如果它在收藏夹列表中)Android Recyclerview OnBindViewHolder仅在滚动时更新ui,android,android-recyclerview,Android,Android Recyclerview,当我打开应用程序时,“保存图像视图”处于工作状态,但当我单击“保存”时,它不会更新“保存图像视图”,它仅在我滚动“回收视图”并滚动回该位置时才工作 我使用房间数据库更新recycler视图项目(如果它在收藏夹列表中) class AdapterHomeMovie( private val databaseDao: DatabaseDao, private val onClick: (Movie) -> Unit, private val onSave: (Movie
class AdapterHomeMovie(
private val databaseDao: DatabaseDao,
private val onClick: (Movie) -> Unit,
private val onSave: (Movie) -> Unit
) : ListAdapter<Movie, MovieViewHolder>(DiffCallBack) {
override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
val item = getItem(position)
val scope = CoroutineScope(Dispatchers.IO)
holder.bind(item, onSave)
holder.itemView.setOnClickListener { onClick(item) }
if (databaseDao.isSaved(item.title)) holder.imgSave.setImageResource(R.drawable.ic_save_yellow)
else holder.imgSave.setImageResource(R.drawable.ic_save_normal)
holder.imgSave.setOnClickListener {
scope.launch {
if (databaseDao.isSaved(item.title)) {
databaseDao.deleteSaveMovie(item.title)
} else {
databaseDao.insertDownloading(
SaveMovie(item.title, item.thumbnail, item.id, item.sid, item.rating.toLong(), System.currentTimeMillis())
)
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {
return MovieViewHolder(ItemMovieBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
companion object{
val DiffCallBack = object : DiffUtil.ItemCallback<Movie>() {
override fun areItemsTheSame(oldItem: Movie, newItem: Movie): Boolean {
return oldItem.title == newItem.title
}
override fun areContentsTheSame(oldItem: Movie, newItem: Movie): Boolean {
return oldItem == newItem
}
override fun getChangePayload(oldItem: Movie, newItem: Movie): Any? {
return super.getChangePayload(oldItem, newItem)
}
}
}
}
class adapter家庭电影(
私有val数据库DAO:databaseDao,
二等兵val onClick:(电影)->单位,
二等兵瓦伦萨维:(电影)->单位
):ListAdapter(DiffCallBack){
覆盖BindViewHolder(holder:MovieViewHolder,位置:Int){
val item=getItem(位置)
val scope=CoroutineScope(Dispatchers.IO)
持有人。绑定(项目,保存)
holder.itemView.SetOnClick侦听器{onClick(项)}
if(databaseDao.isSaved(item.title))holder.imgSave.setImageResource(R.drawable.ic\u save\u黄色)
else holder.imgSave.setImageResource(R.drawable.ic\u save\u normal)
holder.imgSave.setOnClickListener{
范围.发射{
if(databaseDao.isSaved(item.title)){
databaseDao.deleteSaveMovie(item.title)
}否则{
databaseDao.insertDownloading(
SaveMovie(item.title、item.缩略图、item.id、item.sid、item.rating.toLong()、System.currentTimeMillis())
)
}
}
}
}
重写CreateViewHolder(父级:ViewGroup,viewType:Int):MovieViewHolder{
返回MovieViewHolder(ItemMovieBinding.inflate(LayoutFlater.from(parent.context),parent,false))
}
伴星{
val DiffCallBack=object:DiffUtil.ItemCallback(){
覆盖乐趣项目相同(旧项目:电影,新项目:电影):布尔值{
返回oldItem.title==newItem.title
}
覆盖乐趣内容相同(旧项:电影,新项:电影):布尔值{
返回oldItem==newItem
}
覆盖有趣的getChangePayload(oldItem:Movie,newItem:Movie):有吗{
返回super.getChangePayload(oldItem,newItem)
}
}
}
}
更新数据时,必须通知位置处的项目已更改
holder.imgSave.setOnClickListener{
scope.launch {
if (databaseDao.isSaved(item.title)) {
databaseDao.deleteSaveMovie(item.title)
} else {
databaseDao.insertDownloading(
SaveMovie(item.title, item.thumbnail, item.id, item.sid, item.rating.toLong(), System.currentTimeMillis())
)
}
notifyItemChanged(position)
}
}
您可以在
LiveData
中使用包装您的列表
。实际上,房间支持LiveData
开箱即用
我想你的片段你可以这样做:
val liveMovieList : LiveData<List<Movie>> = // fetch data from dao
...
liveMovieList.observe(viewLifecycleOwner, Observer { movies ->
yourListAdapter.submitList(movies);
});
要使用LiveData
,您需要在应用程序级构建梯度文件中添加以下依赖项:
dependencies {
def lifecycle_version = "2.2.0"
def arch_version = "2.1.0"
...
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}
为什么要使用LiveData
- 确保用户界面与数据状态匹配
- 没有内存泄漏
- 没有因停止活动而导致的崩溃
- 不再需要手动处理生命周期
- 始终更新数据
- 正确的配置更改
- 共享资源
您可以在上阅读更多信息,我知道,但我在《回收者》中使用的列表是来自firebase而非Room。无论如何,谢谢您的回答
dependencies {
def lifecycle_version = "2.2.0"
def arch_version = "2.1.0"
...
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}