notifyItemChanged(int position) 更新 RecyclerView 中的多个项目
Posted
技术标签:
【中文标题】notifyItemChanged(int position) 更新 RecyclerView 中的多个项目【英文标题】:notifyItemChanged(int position) updates multiple items in RecyclerView 【发布时间】:2017-01-13 13:53:05 【问题描述】:我正在使用 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
【问题讨论】:
标题也会出现这种情况吗? @Dharmbir Singh 没有标题保持不变 请发布完整的适配器代码。 @VasileDoe 请显示更多代码 尝试将... extends RecyclerView.Adapter<GridItemsAdapter.ViewHolder>
改为... extends RecyclerView.Adapter<MyAdapter.ViewHolder>
【参考方案1】:
问题出在您的 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);
【讨论】:
【参考方案2】:试试这个,
MyObj newModifiedItem = myList.get(position); //getting object from the list
newModifiedItem.setMySpecialStatus(true);
notifyItemChanged(position, newModifiedItem);
【讨论】:
感谢您的时间,但这与我已经使用但没有成功的完全相同 你能改变 boolean isSpecial = myObj.getMySpecialStatus(); to final boolean isSpecial = myObj.getMySpecialStatus();以上是关于notifyItemChanged(int position) 更新 RecyclerView 中的多个项目的主要内容,如果未能解决你的问题,请参考以下文章
为啥 notifyItemChanged(position) 不更新 RecyclerView 中的所有项目?
Android RecyclerView Adapter notifyItemChanged() 获取 IllegalStateException 已经在池中
Android-RecyclerView系列 notifyItemChanged() - 实现单选选中状态更新