Reputation: 89
I have a RecyclerView
and 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);
}
}
}
Current it work but it affect other unclicked parts
Upvotes: 3
Views: 10447
Reputation: 89
notifyItemChanged(Adapterposition) , Work fine , and here is some description
notifyItemChanged method tell OnBind To redraw item at that position, Your must consider update arrayData 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);
}
});
This is exactly like in my case , ( and the same as to update background color , text colors etc .
You can create an identifier ( simply a boolean array ) which contain status of your rows , let say all rows will have a boolean value false , when a row is click update booleanArray at that position to be true , remember to tell on bind to consider true element with specific operation like different colors , different font , etc , and finally notify notifyItemChanged(Adapterposition);
Onclick event changes appear , but after scrolling away from that view and back again OnBind Keep on Recreating the view with the same Data as old ones . ( its important to either update the array data at position or to have a flag that show data have been updated )
My view come with drawable item which i never update on bind , so Onclick , those items that appear to be at the same UI with clicked item will also reflect changes . ( There was mixed concept of dynamic view element and static view element )
Consider to put your data in Array first .
Onclick Update your SQLite data in background and update view to reflect that data (Don't waste memory on redraw the whole recyclerview from SQLite again)
Thanks to all contributers .
Upvotes: 3
Reputation: 561
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);}}
Upvotes: 0
Reputation: 1555
Here is an alternative way of achieving this. Below is sample RecyclerView Adapter which you can modify and use in your codes, The main implementation is on the onBindViewHolder and onCreateViewHolder which creates the custom view holder defined on 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 a sample 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);
}
}
Upvotes: 0
Reputation: 860
As mentioned by @sumit use the mentioned code in ViewHolder
constructor. Define a onBind
function 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 onBindViewHolder
of adapter like
@Override
public void onBindViewHolder(ViewHolder versionViewHolder, int i) {
versionViewHolder.onBind();
}
You may directly set img
to default resource in onBindViewHolder
for your case. You should perform default settings for widgets of an item in onBindViewHolder
or onRecycled
otherwise you will see modified views bacause views are recycled most of the time.
Upvotes: 0
Reputation: 561
better to put it into onBindViewHolder
and generate 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 final keywords from parameters
Upvotes: 2
Reputation: 1087
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);
}
});
}
Upvotes: 2