6

enter image description herelàm thế nào để thêm một người biết lắng nghe cho các hộp kiểm trong một cái nhìn adapter, Android, ArrayAdapter, onCheckedChanged, OnCheckedChangeListener

Tôi có một ListView rằng bằng cách sử dụng một ArrayAdapter là dân cư từ cách nhìn xml phụ nhỏ. mỗi khung nhìn nhỏ chỉ có hai thứ bên trong, một hộp kiểm và một nhãn chuỗi bên cạnh nó.

tôi muốn đặt người nghe onCheckedChanged để nắm bắt sự kiện của người dùng kiểm tra hoặc bỏ chọn hộp kiểm.

ví dụ người nghe đưa ra ở đây:

listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

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

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

} 

}

nơi nào tôi đặt mã người nghe? và làm cách nào để thiết lập?

mã cho 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; 
    } 


} 

Trả lời

29

Không sử dụng ví dụ của bạn listView.setOnCheckedChangeListener hoặc onCheckedChanged mã.

Trước hết, đối với CheckBox, bạn nên sử dụng setOnClickListener() thay vì setOnCheckedChangeListener(). Bạn có thể nhận trạng thái đã chọn bên trong của hàm onClick().

Thứ hai, đặt setOnClickListener() vào bên trong chức năng getView() của bộ điều hợp danh sách.

Ví dụ:

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

tôi không nghĩ rằng việc này vì quan điểm listview tái chế. Khi bạn cuộn xuống và một convertView đã chọn được tái chế, hàng đã chọn sẽ bị bỏ chọn. Làm thế nào để bạn có được xung quanh này? –

+4

Đây là hành vi đúng. Khi Chế độ xem được sử dụng lại, tất cả các trẻ em trong chế độ xem con của nó đều có đặc điểm của chế độ xem vô nghĩa đã được tái chế. Do đó, bạn phải cập nhật tất cả các khung nhìn và các thuộc tính của chúng trong 'getView()' mỗi lần. Điều này bao gồm thiết lập giá trị CheckBox cũng như 'OnClickListener' của nó. Tóm lại, giữ người nghe và thêm 'checkBox.setChecked()' để đặt giá trị đó thành giá trị mong đợi trong trường hợp chế độ xem được tái chế (hoặc mới) có cài đặt khác. –

1

Cảm ơn bạn David! về bình luận HukeLau_DABA, tôi đã giải quyết nó bằng cách cập nhật đối tượng xem danh sách với giá trị CheckBox bên trong OnClickListener(). Trong trường hợp của tôi, tôi có một danh sách các địa điểm, như có thể thấy trong các mã tiếp theo:

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

không đề cập đến "holder.placeCheckBox" trong OnClickListener của bạn, bạn nên tham khảo để xem được thông qua bởi onClick và đúc nó vào hộp kiểm do đó, mã sẽ giống như thế này:

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

Bạn có thể thử này:

holder.placeCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
     Log.d(TAG, "onCheckedChanged: " + holder.placeCheckBox.getText() + " " + (b ? "selected":"deselected")); 
    } 
}); 
Các vấn đề liên quan