[英]Update Specific item in recyclerview
我有一个RecyclerView
和适配器
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);
}
}
}
当前它工作但它影响其他未被点击的部分
notifyItemChanged(Adapterposition),工作正常,这里有一些描述
notifyItemChanged方法告诉OnBind要在该位置重绘项目,您必须考虑在该位置更新arrayData以反映新的更改,然后再调用此方法
versionViewHolder.ClickedView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ArrayDataAt[position] = " New Data to replace Old one ";
notifyItemChanged(Adapterposition);
}
});
这与我的情况完全相同(和更新背景颜色,文本颜色等相同)。
你可以创建一个包含行状态的标识符(只是一个布尔数组),假设所有行都有一个布尔值为false,当一行单击时更新booleanArray在该位置为true,记得告诉bind要考虑具有特定操作的真实元素,如不同的颜色,不同的字体等,最后通知notifyItemChanged(Adapterposition);
Onclick事件更改出现,但滚动远离该视图后再返回OnBind Keep on使用与旧数据相同的数据重新创建视图。 ( 对于更新位置的数组数据或显示数据的标志已更新非常重要 )
我的视图带有drawable项目,我永远不会在绑定上更新,因此Onclick,那些看似与被点击项目在同一UI的项目也将反映更改。 ( 动态视图元素和静态视图元素有混合概念 )
考虑先将数据放入Array中。
Onclick在后台和更新视图中更新您的SQLite数据以反映该数据( 不要浪费内存重新从SQLite重新绘制整个Recyclerview )
感谢所有贡献者。
在viewHolder构造函数中使用此代码:
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);
}
});
}
最好将它放入onBindViewHolder
并生成按钮单击这样
@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);
}
});
}
从参数中删除最终关键字
正如@sumit所提到的,使用ViewHolder
构造函数中提到的代码。 在ViewHolder
中定义一个onBind
函数,将img
设置为其默认状态。
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);
}
}
最后从适配器的onBindViewHolder
调用onBind
@Override
public void onBindViewHolder(ViewHolder versionViewHolder, int i) {
versionViewHolder.onBind();
}
您可以直接在onBindViewHolder
中将img
设置为默认资源。 您应该在onBindViewHolder
或onRecycled
中对项目的小部件执行默认设置,否则您将看到修改后的视图,因为大多数时候都会回收视图。
这是实现这一目标的另一种方法。 下面是您可以在代码中修改和使用的示例RecyclerView适配器。主要实现在onBindViewHolder和onCreateViewHolder上,它创建在TransactionViewHolder类上定义的自定义视图持有者。
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();
}
}
这是一个示例ViewHolder类
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);
}
}
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);}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.