2011-02-09 36 views
14

Tôi có: Tôi có một ListView với các hàng tùy chỉnh, có một CheckBox & hai TextViews trong mỗi hàng. Tôi có một nút cho "Chọn tất cả".Chọn tất cả các mục của một ListView (hàng tùy chỉnh có hộp kiểm trong đó)

Điều tôi muốn: Tôi muốn rằng khi tôi nhấp vào nút, tất cả hộp kiểm trong ListView sẽ được chọn/bỏ chọn.

Vấn đề là gì: Trong OnClick của nút "Chọn tất cả". tôi đang làm điều này:

public void OnClickSelectAllButton(View view) 
{ 
    ListView l = getListView(); 
    int count = l.getCount(); 
    for(int i=0; i<count; ++i) 
    { 
     ViewGroup row = (ViewGroup)l.getChildAt(i); 
     CheckBox check = (CheckBox) row.findViewById(R.id.checkBoxID); 
     check.setChecked(true); // true for select all and false for unselect all etc.. 
    } 
} 

Đây l.getChildAt (i) được đem lại cho tôi chỉ có mục hiển thị. Và khi chỉ mục ra khỏi các mục hiển thị, vấn đề xảy ra. Tôi muốn kiểm tra tất cả các hộp kiểm trong danh sách, không chỉ là những cái nhìn thấy được.

+0

bản sao có thể có của [Chế độ xem danh sách Android Checkbox chọn tất cả (tắt/bật)] (http://stackoverflow.com/questions/4553186/android-checkbox-listview-select-all-disable-enable) –

Trả lời

21

Nó sẽ xảy ra, bởi vì ListView bộ chuyển đổi tái sử dụng quan điểm. Cách bạn đang cố gắng làm là không chính xác. Tôi không nghĩ rằng bạn nên truy cập vào hàng listview thông qua trẻ em listview.

Giới thiệu biến số trong hoạt động của bạn, điều này sẽ giữ trạng thái hiện tại (boolean checkAll). Khi người dùng nhấn nút, nó phải đặt "checkAll" thành true và gọi notifyDataSetChanged() (đối với arrayadapter) hoặc requery() (đối với cursoradapter) trên bộ điều hợp ListView của bạn. Trong phương thức getView() của bộ điều hợp giới thiệu séc cho lá cờ này, vì vậy if (checkAll) {check the check box}

+0

Alex, Cảm ơn bạn đã Ý tưởng. Nó đã làm việc. Cheers =) – Khawar

0

Tôi nghĩ bạn nên chạy tác vụ dài hạn này ngoài chuỗi giao diện người dùng. Khi bạn nhấp vào nút ở OnClickListener:

new Thread(new Runnable() { 
         @Override 
         public void run() { 
          for (int i = 0; i < list.getAdapter().getCount(); i++) { 
           final int position = i; 
           mHandler.post(new Runnable() { 
            @Override 
            public void run() { 
             list.setItemChecked(pos, true); 
            } 
           }); 
          } 
         } 
        }).start();  

và trong onCreate():

this.mHandler = new Handler(); 

Mỗi mục trong danh sách xem nên Checkable như CheckableRelativeLayout mà thực hiện giao diện Checkable.

Các vấn đề liên quan