Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Recyclerview OnBindViewHolder仅在滚动时更新ui_Android_Android Recyclerview - Fatal编程技术网

Android Recyclerview OnBindViewHolder仅在滚动时更新ui

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

当我打开应用程序时,“保存图像视图”处于工作状态,但当我单击“保存”时,它不会更新“保存图像视图”,它仅在我滚动“回收视图”并滚动回该位置时才工作

我使用房间数据库更新recycler视图项目(如果它在收藏夹列表中)

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"
}