Refresh specific item in recyclerview

I also have an RecyclerView

adapter

public class AdapterToUpdateOk extends RecyclerView.Adapter<AdapterToUpdateOk.VersionViewHolder> {
String[] desc;
Context context;
LayoutInflater inflater;

AdapterToUpdateOk adapter;

public AdapterToUpdateOk(Context context,String [] desc) {
    this.context = context;
    this.desc= desc;
    inflater = LayoutInflater.from(context);
}

@Override
public VersionViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = inflater.inflate(R.layout.inflater_sugessted_friends, viewGroup, false);
    return new VersionViewHolder(view);
}

@Override
public void onBindViewHolder(final VersionViewHolder versionViewHolder, final int i) {
    final VersionViewHolder v = versionViewHolder;
    versionViewHolder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            versionViewHolder.imageView.setImageResource(R.drawable.ic_ok);
        }
    });

}

@Override
public int getItemCount() {
    return desc.length;
}

class VersionViewHolder extends RecyclerView.ViewHolder {
    Button button;
    ImageView imageView;;
    public VersionViewHolder(final View itemView) {
        super(itemView);
        button= itemView.findViewById(R.id.button);
        imageView = itemView.findViewById(R.id.imageview);
    }

}

      

}

Work in progress, but it affects other loose parts.

+3


source to share


6 answers


Answer: (Refresh specific item in recyclerview)

notifyItemChanged (Adapterposition) works great and here is the description

notifyItemChanged tell method OnBind To redraw an item at this position, update arrayData must be considered at that position to reflect new changes before calling this method.

      versionViewHolder.ClickedView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ArrayDataAt[position] = " New Data to replace Old one ";
            notifyItemChanged(Adapterposition);
        }
    });

      

What else if you want to change something that doesn't come from the array dataset?

This is exactly the same as in my case (and the same as for updating the background color, text color, etc.)

You can create an id (just a boolean array) that contains the status of your strings, let all strings be boolean false, when the string is clicked update booleanArray at that position, to be true, remember to specify bind to consider the true element with a specific operation , for example, different colors, different fonts, etc. and finally notifyItemChanged (Adapterposition);



So what happened to my code

  • Changes to the Onclick event will appear, but after scrolling that view and back. OnBind Keep on Play the view with the same data as the old ones. (it is important to either update the array data at the position or update the flag displaying the data)

  • There is an element in my view that I never update on binding, so onclick those elements that appear in the same interface with the element clicked will reflect the changes as well. (There was a mixed concept of a dynamic view element and a static view element)

What else if some data comes from SQLite?

Consider first that your data is in an array.

Onclick Refresh SQLite data in the background and refresh the view to reflect this data ( Don't waste memory recycling the whole recyclerview from SQLite again )

Thanks to all contributors.

+2


source


use this code in your viewHolder constructor:



public ViewHolder(View view){
button = (Button) view.findViewById(R.id.yourButtonId);

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               img.setImageResource(R.drawable.ic_ok);

            }
        });

}

      

+2


source


better to put it in onBindViewHolder

and generate a button click like this,

@Override
 public void onBindViewHolder(ViewHolder versionViewHolder, int i) {
    versionViewHolder.button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   img.setImageResource(R.drawable.ic_ok);

                }
            });
}

      

remove trailing keywords from parameters

+2


source


As mentioned, @sumit uses the specified code in the constructor ViewHolder

. Define a function onBind

in ViewHolder

that sets img

to its default state.

class ViewHolder extends RecyclerView.ViewHolder {
  Button button;
  ImageView img;

  public ViewHolder(View view){
      button = (Button) view.findViewById(R.id.ButtonId);
      img = (ImageView) view.findViewById(R.id.ImageViewId);
      button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               img.setImageResource(R.drawable.ic_ok);    
            }
      });    
    }

    void onBind(){
        img.setImageResource(R.drawable.default_image_resource);
    }

}

      

Finally call onBind

from the onBindViewHolder

adapter like

@Override
 public void onBindViewHolder(ViewHolder versionViewHolder, int i) {
    versionViewHolder.onBind();
}

      

You can directly set img

to the default resource onBindViewHolder

for your case. You must set the default settings for the item widgets in onBindViewHolder

or onRecycled

, otherwise you will see the changed views. The bacause views are overhauled most of the time.

0


source


Here's an alternative way to achieve this. Below is an example of a RecyclerView adapter that you can modify and use in your codes. The main implementation is onBindViewHolder and onCreateViewHolder, which creates a custom view holder defined in the TransactionViewHolder class.

public class TransactionHistoryAdapter extends RecyclerView.Adapter<TransactionViewHolder> {
private static final String TAG =TransactionHistoryAdapter.class.getSimpleName();
private  List<Model> orders;
private Context context;

public TransactionHistoryAdapter(List<Model> orders, Context context) {
    this.orders = orders;
    this.context = context;
}

@Override
public TransactionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.view_order_item, parent, false);
    return new TransactionViewHolder(view);
}

@Override
public void onBindViewHolder(final TransactionViewHolder holder, int position) {
    final Order model = (Order) orders.get(position);

    holder.date.setText(model.getOrder_date());
    holder.deliveryCode.setText(model.getDelivery_code());
    holder.totalCost.setText("Tsh "+model.getTotalCost());
    if(model.getStatus()==-1){
        holder.status.setText("Please wait, Your order has been PLACED");
        holder.stateProgress.setCurrentStateNumber(StateProgressBar.StateNumber.ONE);
        holder.totalCost.setText("Not Available");
        holder.deliveryCode.setText(" - ");
        holder.viewDetailsButton.setText(model.getOrder_summary());
    }else if(model.getStatus()==0){
        holder.status.setText("Your order is PENDING");
        holder.stateProgress.setCurrentStateNumber(StateProgressBar.StateNumber.ONE);
    }else if(model.getStatus()==1){
        holder.status.setText("Your order is on Transit");
        holder.stateProgress.setCurrentStateNumber(StateProgressBar.StateNumber.TWO);
    }else if(model.getStatus()==2){
        holder.status.setText("Your order was Delivered");
        holder.stateProgress.setAllStatesCompleted(true);
    }else{
       holder. status.setText("This order was canceled");
    }

    if(model.getStatus()!=-1) {
        holder.viewDetailsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, OrderDetailsActivity.class);
                intent.putExtra("order_id", model.getId());
                context.startActivity(intent);
            }
        });
    }
}

@Override
public int getItemCount() {
    return orders.size();
}
}

      

And here is an example of the ViewHolder class

public class TransactionViewHolder extends RecyclerView.ViewHolder {
public View itemView;
public TextView date;
public TextView totalCost;
public TextView status;
public TextView deliveryCode;
public StateProgressBar stateProgress;
public TextView viewDetailsButton;

public TransactionViewHolder(View itemView) {
    super(itemView);
    this.itemView = itemView;
    date = (TextView) itemView.findViewById(R.id.order_date_value);
    stateProgress = (StateProgressBar) itemView.findViewById(R.id.progress);
    totalCost = (TextView) itemView.findViewById(R.id.total_value);
    status = (TextView) itemView.findViewById(R.id.order_status);
    deliveryCode = (TextView) itemView.findViewById(R.id.order_number_value);
    viewDetailsButton = (TextView) itemView.findViewById(R.id.view_details_button);
}
}

      

0


source


public class AdapterToUpdateOk extends RecyclerView.Adapter<AdapterToUpdateOk.VersionViewHolder> {
String[] desc;
Context context;
LayoutInflater inflater;
private OnDashBoardClickListener onDashBoardClickListener;
AdapterToUpdateOk adapter;

public AdapterToUpdateOk(Context context,String [] desc) {
    this.context = context;
    this.desc= desc;
    inflater = LayoutInflater.from(context);
}

@Override
public VersionViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = inflater.inflate(R.layout.inflater_sugessted_friends, viewGroup, false);
    return new VersionViewHolder(view);
}
public void setOnDashBoardClickListener(OnDashBoardClickListener onDashBoardClickListener) {
    this.onDashBoardClickListener = onDashBoardClickListener;
}
@Override
public void onBindViewHolder(final VersionViewHolder versionViewHolder, final int i) {
    final VersionViewHolder v = versionViewHolder;
    viewHolder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(onDashBoardClickListener!=null)

                    onDashBoardClickListener.onClick(viewHolder.getAdapterPosition(),value);
            }
        });

}
    class ViewHolder extends RecyclerView.ViewHolder {
      Button button;
      ImageView img;

      public ViewHolder(View view){
          button = (Button) view.findViewById(R.id.ButtonId);
          img = (ImageView) view.findViewById(R.id.ImageViewId);

        }

         public void setOnClickListener(View.OnClickListener onClickListener){
            if(onClickListener!=null)
                title_gate_layout.setOnClickListener(onClickListener);
        }

    }interface OnDashBoardClickListener {void onClick(int position,String value);}}

      

0


source







All Articles