2017-06-13 70 views
0

後我使用recyclerView打造切換按鈕(如數字鍵盤)的名單,我想實現:禁用所有其他切換按鈕,一個被點擊

  • 當用戶打開「通過點擊一個按鈕,「關斷」的所有其他按鈕

我試圖增加一個onClickListener視圖支架類的內部,並調用notifyDataSetChanged()使得onBindViewHolder(final ViewHolder holder, int position)稱爲然後改變按鈕的狀態。

但它不起作用,點擊的按鈕不會改變它的狀態。

ViewHolder

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    ToggleButton button; 
    String id; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     button = (ToggleButton) itemView.findViewById(R.id.toggle); 
     button.setOnclickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     ((ToggleButton) view).setChecked(true); 
     int pos = getAdapterPosition(); 
     if (pos != RecyclerView.NO_POSITION) { 
      selected = pos; //store the position of the user clicked button 
      notifyDataSetChanged(); 
     } 
    } 

onBindViewHolder()在我的adpater類

public void onBindViewHolder(final ViewHolder holder, int position) { 
    String data = mData.get(position); 
    holder.id = data; 
    holder.button.setText(data); 
    holder.button.setTextOn(data); 
    holder.button.setTextOff(data); 

    if (position != selected) { //if the button is not the user chosen one 
     if (holder.button.isChecked()) { // and it's in 'ON' state 
      holder.button.toggle(); // toggle it to switch 'OFF' 
     } 
    } 
+0

所以你需要在一個時間上的按鈕進行切換。是嗎? – darwin

+0

避免使用notifyDataSetChanged(),而不是使用notifyItemChanged(pos),如果可能的話,我認爲notifyItemChanged(int pos)適合於你的需求,bcz單個項目一次處於活動狀態。 – darwin

回答

0

有一些事情你做錯了。 ViewHolder應該只包含視圖,而不是單擊處理程序或字符串等(線索在名稱中)。將ViewHolder綁定到數據類時,您可以添加處理程序並操作視圖。

從我可以確定,你想要一個簡單的切換按鈕列表。當一個按鈕打開時,其他按鈕應該關閉。下面爲您創建的測試適配器演示了這一點。

理想情況下,您將避免notifyDataSetChanged並使用基於行的版本,但每次按下切換時,它會影響其他每一行,除非您跟蹤所選行,否則在此用例中沒有選擇。

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.VH> { 

public static class MyData { 
    public boolean Selected = false; 
    public String Text; 

    public MyData(String text) { 
     Text = text; 
    } 
} 

public List<MyData> items = new ArrayList<>(); 

public TestAdapter() { 
    this.items.add(new MyData("Item 1")); 
    this.items.add(new MyData("Item 2")); 
    this.items.add(new MyData("Item 3")); 
} 

@Override 
public TestAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) { 
    return new VH((
      LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.test_layout, parent, false)) 
    ); 
} 

@Override 
public void onBindViewHolder(TestAdapter.VH holder, int position) { 
    final MyData itm = items.get(position); 

    holder.button.setChecked(itm.Selected); 
    holder.text.setText(itm.Text); 

    holder.button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      for (MyData x: items){ 
       x.Selected=false; 
      } 
      itm.Selected = true; 
      notifyDataSetChanged(); 
     } 
    }); 

} 

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

public class VH extends RecyclerView.ViewHolder { 

    ToggleButton button; 
    TextView text; 

    public VH(View itemView) { 
     super(itemView); 
     button = itemView.findViewById(R.id.toggle); 
     text = itemView.findViewById(R.id.text1); 
    } 
} 
} 

test_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 

<ToggleButton 
    android:id="@+id/toggle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

<TextView 
    android:id="@+id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 
+0

我試過你的代碼,並且得到這個異常java.lang.IllegalStateException:當RecyclerView計算佈局或滾動時,無法調用此方法。當bindingView已經在運行時,你不能調用notifyDataSetChanged。您可以使用標誌來指示綁定是否正在運行,或者使用Handler在不同的線程上運行notifyDataSetChanged。 –

+0

這是一個回收器視圖適配器的最基本的演示,在我編寫它時可以正常工作。也許你自己的代碼造成了副作用。試着看這個:https:// stackoverflow。COM /問題/ 27070220/Android的recyclerview-notifydatasetchanged-IllegalStateException異常/ 32373999#32373999 – Kuffs

0

嘗試設置的OnCheckedChangeListener不是「OnclickListener`

`button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      // The toggle is enabled 
     } else { 
      // The toggle is disabled 
     } 
    } 
});` 

的Android文檔:https://developer.android.com/guide/topics/ui/controls/togglebutton.html

0

上點擊監聽組在onBindView和在onclick方法, 首先通過在列表模型 設置參數「關閉」所有的切換按鈕,然後「打開」所選擇的一個如果沒有選擇。

@Override 
public void onClick(View view) { 

    // clear all model values to isSelected false in the list 

}