6

enter image description here如何在適配器來看,Android的,ArrayAdapter,onCheckedChanged添加一個偵聽複選框,OnCheckedChangeListener

我有一個ListView通過一個ArrayAdapter的方式是由小的XML子視圖填充。每個小視圖裏面只有兩件東西,一個複選框和一個字符串標籤。

我想設置一個onCheckedChanged偵聽器來捕獲用戶檢查或取消選中複選框的事件。

例如此處顯示的聽衆:

listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

@Override 
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 

Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show(); 

} 

}

我在哪裏把監聽器代碼?我該如何設置它?對於一個ArrayAdapter

代碼:

public class MobileArrayAdapter extends ArrayAdapter<CheckBoxInfo>{ 
    CheckBoxInfo[] objects; 
    Context context; 
    int textViewResourceId; 

    public MobileArrayAdapter(Context context, int textViewResourceId, 
     CheckBoxInfo[] objects) { 
     super(context, textViewResourceId, objects); 
     this.context = context; 
     this.textViewResourceId = textViewResourceId; 
     this.objects = objects; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row_layout_view = convertView; 


      if ((row_layout_view == null)){ 


       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row_layout_view = inflater.inflate(R.layout.row_layout, null); 
      } 

      //CheckBoxInfo item = objects.get(position); // for arrayList 
      CheckBoxInfo item = objects[position]; 

      if(item != null){ 

      TextView textView = (TextView) row_layout_view.findViewById(R.id.textView1); 
      CheckBox checkBox = (CheckBox) row_layout_view.findViewById(R.id.checkBox1); 

      if(item !=null){ 
      textView.setText(item.checkBoxName); 
      checkBox.setChecked(item.checkBoxState); 
       } 
      } 
      return row_layout_view; 
    } 


} 

回答

29

不要用你的例子listView.setOnCheckedChangeListeneronCheckedChanged代碼。

首先,對於CheckBox,您應該使用setOnClickListener()而不是setOnCheckedChangeListener()。您可以在onClick()函數內獲得已檢查的狀態。

其次,將您的setOnClickListener()放在列表適配器的getView()函數的內部。

checkBox.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     final boolean isChecked = checkBox.isChecked(); 
     // Do something here. 
    } 
}); 
+3

我不認爲這個工程,因爲列表視圖回收的觀點。當您向下滾動並選定的convertView被回收時,選中的行將變爲未選中狀態。你如何解決這個問題? – 2014-08-25 08:10:27

+4

這是正確的行爲。當視圖被重用時,其所有的子視圖中的孩子都具有被回收的無意義視圖的特徵。因此,您必須每次更新'getView()'中的所有視圖及其屬性。這包括設置CheckBox值以及其OnClickListener。總之,如果回收(或新)視圖具有不同的設置,請保持偵聽器並添加'checkBox.setChecked()'將其設置爲預期值。 – 2014-08-26 01:16:36

1

謝謝大衛!關於HukeLau_DABA評論,我通過使用OnClickListener()內的CheckBox值更新列表視圖對象來解決它。在我來說,我有地方的列表,可以在下面的代碼中可以看出:

holder.placeCheckBox.setOnClickListener(new View.OnClickListener() { 

     //please note that objPlace, position and holder must be declared 
     //as final inside the getView() function scope. 
      @Override 
      public void onClick(View arg0) { 
       final boolean isChecked = holder.placeCheckBox.isChecked(); 
       if (isChecked){ 
        objPlace.setItemChecked("yes"); 
       }else{ 
        objPlace.setItemChecked("no"); 
       } 

       placesList.set(position,objPlace); // updating the list with the updated object 

      } 
     }); 
1

沒有提及「holder.placeCheckBox」你onClickListener,你應該參考查看哪些是過去了的onClick和投它複選框,以便代碼看起來應該是這樣:

holder.placeCheckBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      boolean isChecked = ((CheckBox)arg0).isChecked(); 
      if (isChecked){ 
       objPlace.setItemChecked("yes"); 
      }else{ 
       objPlace.setItemChecked("no"); 
      } 

      placesList.set(position,objPlace); // updating the list with the updated object 

     } 
    }); 
0

你可以試試這個:

holder.placeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
     Log.d(TAG, "onCheckedChanged: " + holder.placeCheckBox.getText() + " " + (b ? "selected":"deselected")); 
    } 
}); 
相關問題