繁体   English   中英

在recyclerview中更新特定项目

[英]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);
    }

}

}

当前它工作但它影响其他未被点击的部分

答案:(在recyclerview中更新特定项目)

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);

那么我的代码出了什么问题

  1. Onclick事件更改出现,但滚动远离该视图后再返回OnBind Keep on使用与旧数据相同的数据重新创建视图。 对于更新位置的数组数据或显示数据的标志已更新非常重要

  2. 我的视图带有drawable项目,我永远不会在绑定上更新,因此Onclick,那些看似与被点击项目在同一UI的项目也将反映更改。 动态视图元素和静态视图元素有混合概念

如果某人的数据来自SQLite还有什么?

考虑先将数据放入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设置为默认资源。 您应该在onBindViewHolderonRecycled中对项目的小部件执行默认设置,否则您将看到修改后的视图,因为大多数时候都会回收视图。

这是实现这一目标的另一种方法。 下面是您可以在代码中修改和使用的示例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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM