回收站视图上的按钮重复单击

Button click on recycler view is repeating

我有一个RecyclerView。数据来自服务器。列表项视图包含:

我有 10 个列表项。当我点击按钮时,数据将发送到服务器,提交成功后按钮可见性设置为View.INVISIBLE。问题是每第 7 个按钮也更改为不可见。数据传输工作正常。请帮助我。

绑定视图持有者

@Override
public void onBindViewHolder(final ViewHolder1 holder, final int position) {
    final Ardlist_item listitem = listitems.get(position);

    holder.textitemname.setText(listitem.getItemname());
    holder.liftqty.setText(listitem.getQty());

    holder.rcqty.setText(listitem.getQty());

    holder.b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            holder.b1.setVisibility(View.INVISIBLE);
            holder.rcqty.setEnabled(false);
            Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();

        }
    });
}

获得职位

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

public class ViewHolder1 extends RecyclerView.ViewHolder {

    public TextView liftqty;

    public Button b1;
    public EditText rcqty;
    public ViewHolder1(View itemView) {

        super(itemView);
        textitemname = (TextView) itemView.findViewById(R.id.item_name);
        liftqty = (TextView) itemView.findViewById(R.id.lifted_qty);

        b1 = (Button) itemView.findViewById(R.id.receive_btn);
        rcqty = (EditText) itemView.findViewById(R.id.received_qty);

    }    
}

只需在 holder.rcqty.setText(listitem.getQty()); 之后添加这一行 holder.b1.setVisibility(View.VISIBLE); 就可以了。发生这种情况是因为视图被回收,并且在回收时发现它的可见性消失了,这就是您面临的问题。

您需要更新 onBindViewHolder 中的每个视图。 所以将 attr "active" 添加到您的模型并在点击后更新:

@Override
public void onBindViewHolder(final ViewHolder1 holder, final int position) {
    final Ardlist_item listitem = listitems.get(position);

    holder.textitemname.setText(listitem.getItemname());
    holder.liftqty.setText(listitem.getQty());
    holder.rcqty.setText(listitem.getQty());

    holder.b1.setVisibility(listitem.isActive() ? View.VISIBLE : View.INVISIBLE); // set visibility
    holder.rcqty.setEnabled(listitem.isActive());

    holder.b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Ardlist_item listitem = listitems.get(position);
            listitem.setActive(false); // edit active attribute
            holder.b1.setVisibility(View.INVISIBLE);
            holder.rcqty.setEnabled(false);
            Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();
        }
    });
}

添加属性:

class Ardlist_item {
        //private boolean active = true;//chnaged
   private boolean active = true;

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}

RecyclerView 回收用户不再可见的视图。这意味着,您制作的 INVISIBLE 回收后将不可见。 对于每个项目,您必须通过在 onBindViewHolder 中设置 holder.b1.setVisibility(View.VISIBLE); 来恢复视图的状态。但是,它将重置那些发送到服务器端的项目。您必须实施逻辑来保存项目的状态。假设 listitem.isSent()。那么你将拥有:

final Ardlist_item listitem = listitems.get(position);

holder.b1.setVisibility(listitem.isSent()? View.INVISIBLE : View.VISIBLE);
holder.textitemname.setText(listitem.getItemname());
...
            holder.b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listitems.setSent(true);

                holder.b1.setVisibility(View.INVISIBLE);
                holder.rcqty.setEnabled(false);
                Toast.makeText(context, "clicled" + position, Toast.LENGTH_LONG).show();

            }
        });

我遇到了同样的问题。希望经过大量研究后,我找到了解决方案。

实际上,recyclerview 创建了 8 个视图持有者,然后它重新使用了已经制作好的适配器。因此,如果您对它们进行任何更改,它将继续到每第 7 个视图持有者,因为它们都是相同的。

所以要解决这个问题,你必须在每次使用时初始化所有视图。

即使我遇到了同样的问题,也有两种方法可以解决这个问题;

  1. {你的回收站视图}.setItemViewCacheSize(9); 我发现 9 与我的代码完美配合,甚至可能应该与 你的。

  2. 在你的适配器Class中,在onBindViewHolder下添加一行 " holder.bind(userModal1); "

    然后在ViewHolder

    下创建一个名为bind的方法

    然后设置与 onBindViewHolder

    中相同的 textview 、 imageview 、 button

为了更好地理解我也添加了一张照片

第一种解决问题的方法

{

cache one

}

这是第二种方法

{

onBindViewHolder

ViewHolder---method bind

}