[英]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;
}
}
即使我面臨同樣的問題,也有兩種方法可以解決這個問題;
{你的回收者視圖}.setItemViewCacheSize(9); 我發現 9 與我的代碼完美兼容,甚至可能應該與你的代碼一起使用。
在您的適配器類中,在onBindViewHolder下添加一行“holder.bind(userModal1);”
然后在ViewHolder下創建一個名為bind的方法
然后設置與您在onBindViewHolder 中所做的相同的 textview 、 imageview 、 button
為了更好地理解,我還添加了一張照片
解決問題的第一種方法
{
}
這是第二種方法
{
}
只需添加此行holder.b1.setVisibility(View.VISIBLE);
在holder.rcqty.setText(listitem.getQty());
它會做。 發生這種情況是因為視圖被回收,並且在回收時發現它的可見性消失了,這會導致您面臨的問題。
我面臨同樣的問題。 希望經過大量研究,我找到了解決方案。
實際上,recyclerview 創建了 8 個視圖持有者,然后它重用了已經制作的適配器。 因此,如果您對它們進行任何更改,它將繼續到每個第 7 個視圖持有者,因為兩者都是相同的。
所以要解決這個問題,你必須在每次使用時初始化所有的 viewholders 視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.