【问题标题】:notifyItemChanged(int position) updates multiple items in RecyclerViewnotifyItemChanged(int position) 更新 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&lt;GridItemsAdapter.ViewHolder&gt;改为... extends RecyclerView.Adapter&lt;MyAdapter.ViewHolder&gt;

标签: android android-recyclerview


【解决方案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();
    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2018-09-18
    相关资源
    最近更新 更多