मैं एक ऐप बना रहा हूं जिसमें उपयोगकर्ता कुछ वस्तुओं को पसंदीदा बना सकता है। मैं इसे एक टुकड़े के अंदर एक रीसाइक्लिंगव्यू में दिखा रहा हूं। उपयोगकर्ता डिलीट बटन पर क्लिक करके आइटम को पसंदीदा आइटम सूची से हटा भी सकता है। मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि यदि उपयोगकर्ता सूची के अंत में हटा देता है और आइटम को पुन: लोड करता है और शुरुआत से दिखाता है। मैं एमवीवीएम का उपयोग कर रहा हूं और लाइवडाटा का उपयोग कर रहा हूं। यहाँ मेरा कोड है

FragmentFavorite.kt

class FavoriteFragment :Fragment() {


    lateinit var favoriteViewModel: FavoriteViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)

    }

    override fun onCreateView(

        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val v=inflater.inflate(R.layout.fragment_favorite,container,false)

        favoriteViewModel=ViewModelProvider(requireActivity()).get(FavoriteViewModel::class.java)

        val recylerview=v.findViewById<RecyclerView>(R.id.recylerviewFav)
        recylerview.layoutManager=LinearLayoutManager(requireContext(),RecyclerView.VERTICAL,false)


        favoriteViewModel.getAll(requireContext()).observe(requireActivity(), Observer {

            val adapter=FavoriteAdapter(it,requireContext(),object:FavoriteDeleteListener{
                override fun OnFavDelete(id: Int) {
                    favoriteViewModel.deleteFav(requireContext(),id)

                }

            })
            recylerview.adapter=adapter

        })



        return v
    }


}

RecylerviewAdapter.kt

class FavoriteAdapter(val list:List<Favorite>,context: Context,val listener:FavoriteDeleteListener) :RecyclerView.Adapter<FavoriteAdapter.MyViewholder> (){


    val listofFav=list.reversed()
    class MyViewholder(itemview: View):RecyclerView.ViewHolder(itemview) {
        val textview_src=itemview.findViewById<TextView>(R.id.textview_src)
        val textView_tar=itemView.findViewById<TextView>(R.id.textview_tar)
        val delte_fav=itemview.findViewById<ImageView>(R.id.delete_fav)
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): FavoriteAdapter.MyViewholder {
      val v=LayoutInflater.from(parent.context).inflate(R.layout.fav_list,parent,false)

        return MyViewholder(v)

    }

    override fun onBindViewHolder(holder: FavoriteAdapter.MyViewholder, position: Int) {

        holder.textView_tar.text=listofFav[position].translated_text
        holder.textview_src.text=listofFav[position].text_to_translate

        holder.delte_fav.setOnClickListener {
            listofFav[position].fid?.let { it1 -> delete(it1,listener)
                notifyItemRemoved(position)
                }

        }





    }

    override fun getItemCount(): Int {

        return listofFav.size

    }

    fun delete(id:Int,listene: FavoriteDeleteListener) {
        listene.OnFavDelete(id)
    }
}
0
Ali hassan 21 अक्टूबर 2020, 20:31
इस उत्तर से आपकी समस्या का समाधान होना चाहिए - stackoverflow.com/a/32526482/3145960
 – 
Reaz Murshed
21 अक्टूबर 2020, 20:56
favoriteViewModel.deleteFav() क्या करता है?
 – 
Ben P.
21 अक्टूबर 2020, 20:59
यह कमरे के डेटाबेस से आइटम को हटा देता है
 – 
Ali hassan
21 अक्टूबर 2020, 21:27

1 उत्तर

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

मुझे संदेह है कि समस्या यहाँ है:

favoriteViewModel.getAll(requireContext()).observe(requireActivity(), Observer {
    val adapter=...
    recylerview.adapter=adapter
})

यदि आपके डेटासेट से किसी आइटम को हटाने से प्रेक्षक एक नया डेटासेट उत्सर्जित करता है, तो यह आपके RecyclerView के एडॉप्टर को फिर से असाइन करना समाप्त कर देगा, जो पूरी तरह से दृश्य स्थिति को रीसेट कर देगा।

आप गणना करने के लिए ListAdapter घटक का उपयोग कर सकते हैं एडॉप्टर को हर बार पूरी तरह से ओवरराइट करने के बजाय सूचियों के बीच एक अंतर।

0
Ben P. 21 अक्टूबर 2020, 22:38