点击回收器视图的按钮正在重复

时间:2017-07-24 10:00:07

标签: android android-recyclerview onclicklistener android-button

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

  • 一个TextView
  • 一个EditText
  • 一个Button

我有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);

    }    
}

5 个答案:

答案 0 :(得分:1)

RecyclerView会回收用户不再可见的视图。这意味着,你所做的那个INVISIBLE在被回收时将是不可见的。 对于每个项目,您必须在holder.b1.setVisibility(View.VISIBLE);中设置onBindViewHolder来恢复视图状态。但是,它将重置发送到服务器端的项目。您必须实现逻辑以保存项目的状态。我们说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();

            }
        });

答案 1 :(得分:1)

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

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

  2. 在 Your Adapter Class 中,在 onBindViewHolder 下添加一行 “holder.bind(userModal1);”

    然后在ViewHolder

    下创建一个名为bind的方法

    然后设置与您在 onBindViewHolder

    中相同的 textview 、 imageview 、 button

为了更好的理解,我还添加了一张照片

解决问题的第一种方法

{

cache one

}

这是第二种方法

{

onBindViewHolder

ViewHolder---method bind

}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您需要更新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();
        }
    });
}

添加attr active:

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;
    }
}

答案 4 :(得分:0)

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

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

因此,要解决此问题,您每次使用时都必须初始化所有视图持有者视图。