Home > Net >  Recycler view not update itself
Recycler view not update itself

Time:07-11

I have a problem with recycler view. In my previous app, when i get the list for recycler view adapter from database and observe it in my fragment, i used the notifyDataSetChanged() and when i tried to delete a item , view updated successfully. But in this app this does not work and i don't understand why. When i click the delete button the item deleted in database successfully but i can't see it immediatly. When i go to any other fragment and back to this Favourites fragment i see the items deleted. I tried all the options in stackoverflow but still i can't fix it. My Adapter:


class FavouritesAdapter(owner: ViewModelStoreOwner, val favouritesList : ArrayList<Vocabulary>) : RecyclerView.Adapter<FavouritesAdapter.FavouritesViewHolder>() {
    val viewModel = ViewModelProvider(owner).get(FavouritesViewModel::class.java)

    class FavouritesViewHolder(val binding: FavouritesItemRowBinding) : RecyclerView.ViewHolder(binding.root)


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavouritesViewHolder {
        return FavouritesViewHolder(FavouritesItemRowBinding.inflate(LayoutInflater.from(parent.context), parent, false))

    }

    override fun onBindViewHolder(holder: FavouritesViewHolder, position: Int) {
        holder.binding.englishWordTV.text = favouritesList[position].word
        holder.binding.turkishWordTV.text = favouritesList[position].translation

        holder.binding.deleteButtonRV.setOnClickListener {
            viewModel.deleteVocabulary(favouritesList[position])
            notifyDataSetChanged()
        }

    }

    override fun getItemCount(): Int {
        return favouritesList.size
    }
    fun updateList(myList : List<Vocabulary>) {
        favouritesList.clear()
        favouritesList.addAll(myList)
        notifyDataSetChanged()

    }


} 

My problem is in delete button in my recycler row;

holder.binding.deleteButtonRV.setOnClickListener {
            viewModel.deleteVocabulary(favouritesList[position])
            notifyDataSetChanged()
        }

And here is my fragment ;

class FavouritesFragment : Fragment() {
    private var _binding: FragmentFavouritesBinding? = null
    private val binding get() = _binding!!
    private lateinit var favouritesAdapter : FavouritesAdapter
    private lateinit var viewModel : FavouritesViewModel


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentFavouritesBinding.inflate(inflater, container, false)
        return binding.root


    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel = ViewModelProvider(this).get(FavouritesViewModel::class.java)
        favouritesAdapter = FavouritesAdapter(this, arrayListOf())
        viewModel.getAllVocabulariesFromDB()

        prepareRecyclerView()
        observeFavouritesLiveData()
    }


    fun prepareRecyclerView(){
        binding.favouritesRecyclerView.apply {
            layoutManager = LinearLayoutManager(context)
            adapter = favouritesAdapter
        }
    }

    fun observeFavouritesLiveData(){
        viewModel.favouritesListLiveData.observe(viewLifecycleOwner, Observer {

            it?.let {
                favouritesAdapter.updateList(it)
            }
        })
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null


    }
    
}

CodePudding user response:

It all looks fine to me - you observe the favourites LiveData, that passes the new data to an update function in your Adapter, and that modifies the internal data set and calls notifyDataSetChanged() (which works for any kind of update).

So, are you sure your ViewModel is updating favouritesListLiveData properly when you call deleteVocabulary? Check if your observer is actually firing with a new value when you hit delete, and check if its contents are what you expect (the previous list minus the thing you want removed)

You could check it with some logging, but setting some breakpoints and debugging the app might be more helpful if you're not sure where it's going wrong

(also your button doesn't need to call notifyDataSetChanged() - that only needs to happen when the data is updated, which happens through the update function, in there is the right place for it!)

CodePudding user response:

Try with notifyItemRemoved(position) instead of notifyDataSetChanged().

  • Related