Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue refreshing a view of a row in recyclerview

I want to update a view of the recyclerview when a notifyItemChanged has been called. The thing is that I don't want to refresh the entire row but only the view of the row. (to avoid the blinking effect of the row)

There is a method called notifyItemChanged(int, payload obj).

Can I use that to achieve that? If so how to do it?

like image 973
chathura Avatar asked Feb 16 '16 05:02

chathura


People also ask

How do you make a RecyclerView more performant?

If the size of ImageView in RecyclerView items is not fixed then RecyclerView will take some time to load and adjust the RecyclerView item size according to the size of Image. So to improve the performance of our RecyclerView we should keep the size of our ImageView to make it RecyclerView load faster.


2 Answers

Finally I found how to update only the specific view of a row in RecyclerView.

(1) Override onBindViewHolder(Recycler.ViewHolder VH, int position, List payloads) in the adapter

(2) Inside that onBindViewHolder method,

if(payloads != null && !payloads.isEmpty() && (payloads.get(0) instanceof  customObject)){
   // update the specific view
}else{
   // I have already overridden  the other onBindViewHolder(ViewHolder, int)
   // The method with 3 arguments is being called before the method with 2 args. 
   // so calling super will call that method with 2 arguments. 
   super.onBindViewHolder(holder,position,payloads);
}

(3) So to notify data change and update the view, need to call the notifyItemChanged(int position, Object payload). Need to pass the customObject(model which holds the data) as the payload object.

adapter.notifyItemChanged(i, obj);

Note : Need to disable the RecyclerView's ItemAnimator(By default it is enabled). Otherwise payload object will be empty.

recyclerView.setItemAnimator(null);

or

((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

UPDATE: I used this method recently without disabling the ItemAnimator. So no need to disable ItemAnimator. - (recyclerview-v7:25.4.0)

for further reference

like image 144
chathura Avatar answered Oct 20 '22 17:10

chathura


You can use this to get the view of updated item:

View v = recyclerView.getLayoutManager().findViewByPosition(position);
if (v != null){
    //update your view
}
like image 23
Rey Pham Avatar answered Oct 20 '22 17:10

Rey Pham