Saturday, 1 September 2018

NotifyDataSetChanged does not update the RecyclerView correctly

I am trying to implement a fairly basic logic within my recyclerview adapter but notifyDataSetChanged() is giving me quite the headache.

I have a filter method that looks like this:

fun filter(category: Int) {
    Thread(Runnable {
        activeFiltered!!.clear()

        if (category == -1) {
            filterAll()
        } else {
            filterCategory(category)
        }

        (mContext as Activity).runOnUiThread {
            notifyDataSetChanged()
        }
    }).start()
}

where filterAll() and filterCategory() functions are quite easy:

private fun filterAll() {
    activeFiltered?.addAll(tempList!!)
}

private fun filterCategory(category: Int) {
    for (sub in tempList!!) {
        if (sub.category == category) {
            activeFiltered?.add(sub)
        }
    }
}

When I run this code and filter the list by category the activeFiltered list is updated correctly and contains the items I expect, but when notifyDataSetChanged() is run it only cuts the list's range without updating the items.

Is there a way to fix this?

I also tried, instead of notifyDataSetChanged() to use:

activeFiltered!!.forEachIndexed {index, _ ->  notifyItemChanged(index)}

but the problem is still there.

It isn't a threading issue either since I tried putting the whole logic in the main thread and the list still wasn't updated correctly.

This is my onBindViewHolder():

override fun onBindViewHolder(viewHolder: ActiveViewHolder, pos: Int) {
        inflateView(pos)
    }

This is where I inflate my text, sub is the instance variable set in the onBindViewHolder():

private fun inflateView(pos: Int) {
        viewHolder.title.text = activeFiltered!![pos].title
    }



from NotifyDataSetChanged does not update the RecyclerView correctly

No comments:

Post a Comment