簡體   English   中英

重復單擊回收站視圖上的按鈕

[英]Button click on recycler view is repeating

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

    }    
}

RecyclerView回收用戶不再可見的視圖。 這意味着,您設置為INVISIBLE那個在回收時將不可見。 對於每個項目,您必須通過設置holder.b1.setVisibility(View.VISIBLE);來恢復視圖的狀態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();

            }
        });

您需要更新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 活動:

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

即使我面臨同樣的問題,也有兩種方法可以解決這個問題;

  1. {你的回收者視圖}.setItemViewCacheSize(9); 我發現 9 與我的代碼完美兼容,甚至可能應該與你的代碼一起使用。

  2. 在您的適配器類中,在onBindViewHolder下添加一行“holder.bind(userModal1);”

    然后在ViewHolder下創建一個名為bind的方法

    然后設置與您在onBindViewHolder 中所做的相同的 textview 、 imageview 、 button

為了更好地理解,我還添加了一張照片

解決問題的第一種方法

{

緩存一

}

這是第二種方法

{

onBindViewHolder

ViewHolder---方法綁定

}

只需添加此行holder.b1.setVisibility(View.VISIBLE); holder.rcqty.setText(listitem.getQty()); 它會做。 發生這種情況是因為視圖被回收,並且在回收時發現它的可見性消失了,這會導致您面臨的問題。

我面臨同樣的問題。 希望經過大量研究,我找到了解決方案。

實際上,recyclerview 創建了 8 個視圖持有者,然后它重用了已經制作的適配器。 因此,如果您對它們進行任何更改,它將繼續到每個第 7 個視圖持有者,因為兩者都是相同的。

所以要解決這個問題,你必須在每次使用時初始化所有的 viewholders 視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM