更新 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);
}
}
}
目前有效但会影响其他未点击的部分
在您的 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();
}
您可以根据您的情况直接将 img
设置为 onBindViewHolder
中的默认资源。您应该对 onBindViewHolder
或 onRecycled
中的项目的小部件执行默认设置,否则您将看到修改后的视图,因为视图大部分时间都是回收的。
这是实现此目的的另一种方法。下面是您可以在代码中修改和使用的示例 RecyclerView 适配器,主要实现在 onBindViewHolder 和 onCreateViewHolder 上,它们创建在 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();
}
}
这是一个示例 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);
}
}
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);}}
回答:(更新 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 时,请记住告诉绑定考虑具有特定操作的真实元素,如不同颜色、不同字体等,最后通知 notifyItemChanged(Adapterposition);
所以我的代码出了什么问题
Onclick 事件发生变化,但在滚动离开该视图并再次返回后,OnBind 继续使用与旧视图相同的数据重新创建视图。 (重要的是更新位置的数组数据或有一个显示数据已更新的标志)
我的视图带有可绘制项目,我从未在绑定时更新它,所以单击时,那些看起来与单击项目相同 UI 的项目也会反映更改。 ( 存在动态视图元素和静态视图元素的混合概念 )
如果有人的数据来自 SQLite 怎么办?
考虑先将数据放入数组中。
Onclick 在后台更新您的 SQLite 数据并更新视图以反映该数据(不要浪费内存再次从 SQLite 重绘整个 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);
}
}
}
目前有效但会影响其他未点击的部分
在您的 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();
}
您可以根据您的情况直接将 img
设置为 onBindViewHolder
中的默认资源。您应该对 onBindViewHolder
或 onRecycled
中的项目的小部件执行默认设置,否则您将看到修改后的视图,因为视图大部分时间都是回收的。
这是实现此目的的另一种方法。下面是您可以在代码中修改和使用的示例 RecyclerView 适配器,主要实现在 onBindViewHolder 和 onCreateViewHolder 上,它们创建在 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();
}
}
这是一个示例 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);
}
}
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);}}
回答:(更新 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 时,请记住告诉绑定考虑具有特定操作的真实元素,如不同颜色、不同字体等,最后通知 notifyItemChanged(Adapterposition);
所以我的代码出了什么问题
Onclick 事件发生变化,但在滚动离开该视图并再次返回后,OnBind 继续使用与旧视图相同的数据重新创建视图。 (重要的是更新位置的数组数据或有一个显示数据已更新的标志)
我的视图带有可绘制项目,我从未在绑定时更新它,所以单击时,那些看起来与单击项目相同 UI 的项目也会反映更改。 ( 存在动态视图元素和静态视图元素的混合概念 )
如果有人的数据来自 SQLite 怎么办?
考虑先将数据放入数组中。
Onclick 在后台更新您的 SQLite 数据并更新视图以反映该数据(不要浪费内存再次从 SQLite 重绘整个 recyclerview)
感谢所有贡献者。