जब मैं ऐप खोलता हूं तो सेव इमेज व्यू काम करता है, लेकिन जब मैं सेव पर क्लिक करता हूं तो यह सेव इमेज व्यू को अपडेट नहीं करता है, यह तभी काम करता है जब मैं रिसाइकलव्यू को स्क्रॉल करता हूं और उस स्थिति में वापस स्क्रॉल करता हूं।

यदि पसंदीदा सूची में है तो मैं रीसाइक्लर व्यू आइटम को अपडेट करने के लिए रूम डेटाबेस का उपयोग करता हूं

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)
        }
    }
}
} 
1
Frank Mung No 16 अक्टूबर 2020, 06:14

2 जवाब

सबसे बढ़िया उत्तर

जब आप डेटा धारक को अपडेट करते हैं तो आपको सूचित करना होगा कि स्थिति में आइटम बदल गया है। 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)
    }
}
2
Uuu Uuu 16 अक्टूबर 2020, 06:36

आप अपने List को LiveData में रैप कर सकते हैं। असल में Room बिल्कुल सही LiveData को सपोर्ट करता है।

मैं आपका टुकड़ा आप कुछ ऐसा कर सकते हैं:

val liveMovieList : LiveData<List<Movie>> = // fetch data from dao

...

liveMovieList.observe(viewLifecycleOwner, Observer { movies ->
  yourListAdapter.submitList(movies);
});

अपने दाओ में, आप LiveData इस तरह वापस कर सकते हैं:

@Query("SELECT * from movie_table")
fun getAllMovies() : LiveData<List<Movie>>

LiveData का उपयोग करने के लिए आपको ऐप लेवल बिल्ड ग्रेडल फ़ाइल में निम्नलिखित निर्भरताएँ जोड़नी होंगी:


dependencies {
    def lifecycle_version = "2.2.0"
    def arch_version = "2.1.0"

    ...

    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}

आपको LiveData का उपयोग क्यों करना चाहिए

  • सुनिश्चित करता है कि आपका UI आपकी डेटा स्थिति से मेल खाता है
  • कोई मेमोरी लीक नहीं
  • गतिविधियों को रोकने के कारण कोई दुर्घटना नहीं हुई
  • कोई और मैन्युअल जीवनचक्र प्रबंधन नहीं
  • हमेशा अप टू डेट डेटा
  • उचित कॉन्फ़िगरेशन परिवर्तन
  • संसाधन साझा करना

आप LiveData अवलोकन पर अधिक पढ़ सकते हैं

0
Hardik Sachan 16 अक्टूबर 2020, 06:59