gpt4 book ai didi

android - notifyItemChanged(int position) 更新 RecyclerView 中的多个项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:55:53 26 4
gpt4 key购买 nike

我正在使用 RecyclerView 显示项目列表,我需要按位置更新单个项目的状态。我正在更新列表中的项目,然后调用 notifyItemChanged(int position)像这样:

myList.set(position, newModifiedItem);
notifyItemChanged(position);

该项目已成功更新,但也会随机更新一些其他项目,每次我上下滚动我的项目列表时,也会对其他项目进行此更新(不同的图标状态)。

我在 onBindViewHolder 中进行更改,我按位置检查列表项并决定设置不同的状态。

完整适配器代码:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

private List<MyObj> myList;

public MyAdapter(List<MyObj> list) {
this.myList = list;
}

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

public void onBindViewHolder(final ViewHolder holder, final int position) {
MyObj myObj = myList.get(position);
boolean isSpecial = myObj.getMySpecialStatus();

holder.myItemTitle.setText(myObj.getTitle());

//decide if item has different icon state
if (isSpecial) {
holder.myItemIcon.setImageResource(R.drawable.ic_special);
}
}

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


public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView myItemTitle;
public ImageView myItemIcon;
public LinearLayout itemClickable;
//some other views

public ViewHolder(View itemView) {
super(itemView);
myItemTitle = (TextView) itemView.findViewById(R.id.item_title);
myItemIcon = (ImageView) itemView.findViewById(R.id.item_img);

itemClickable = (LinearLayout) itemView.findViewById(R.id.item_clickable_zone);
itemClickable.setOnClickListener(this);

//some other views
}

@Override
public void onClick(View v) {
final int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {

switch (v.getId()) {
case R.id.item_clickable_zone: {

//some logic to change status - here just an idea
MyObj newModifiedItem = myList.get(position);
newModifiedItem.setMySpecialStatus(true);

myList.set(position, newModifiedItem);
notifyItemChanged(position);
break;
}

//some other views on click
}
}
}
}
}

最佳答案

问题出在您的 onBindViewHolder() 中,您没有为 if 语句使用 else 大小写。它应该是这样的:

public void onBindViewHolder(final ViewHolder holder, final int position) {
MyObj myObj = myList.get(position);
boolean isSpecial = myObj.getMySpecialStatus();

holder.myItemTitle.setText(myObj.getTitle());

//decide if item has different icon state
if (isSpecial) {
holder.myItemIcon.setImageResource(R.drawable.ic_special);

} else {
//here is the trick - set normal state back
holder.myItemIcon.setImageResource(R.drawable.ic_standard);
}
}

关于android - notifyItemChanged(int position) 更新 RecyclerView 中的多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39343368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com