2012-03-25 29 views
6

tôi đã thực hiện một phong tục Listview (Nếu không có trọng getView() phương pháp) với mỗi mục trong một listview có một Layout sauForce listview không để tái sử dụng views (Checkbox)

contactlayout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" android:weightSum="1"> 
    <CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_width="134dp" android:layout_height="108dp" android:focusable="false"></CheckBox> 
    <LinearLayout android:id="@+id/linearLayout1" android:layout_height="match_parent" android:orientation="vertical" android:layout_width="87dp" android:layout_weight="0.84" android:weightSum="1" > 
     <TextView android:text="TextView" android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/name" android:layout_weight="0.03"></TextView> 
     <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/phone"></TextView> 
     <TextView android:text="TextView" android:layout_height="wrap_content" android:layout_weight="0.03" android:layout_width="match_parent" android:id="@+id/contactid" android:visibility="invisible"></TextView> 
    </LinearLayout> 
</LinearLayout> 

tôi đang điền vào số Listview bằng cách sử dụng SimpleCursorAdapter theo cách sau ...

Cursor c = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 

     String from[] = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; 
     int to[] = new int[]{R.id.name,R.id.phone,R.id.contactid}; 
     SimpleCursorAdapter s = new SimpleCursorAdapter(this,R.layout.contactlayout,c,from,to); 
     lv.setAdapter(s); 

Khi bấm vào nút Tôi đang đọc các trạng thái của tất cả các hộp kiểm. Vấn đề là, nếu tôi kiểm tra một CheckBox một số người khác xuống dòng sẽ tự động được kiểm tra. Tôi biết điều này đang tái sử dụng Chế độ xem. Làm thế nào để tránh nó? Tôi thậm chí không ghi đè phương pháp getView() trong trường hợp này, vì vậy tôi tự hỏi liệu có cách nào để đạt được những gì tôi muốn không?

trả lời

Cuối cùng tôi thực hiện những gì @sastraxi gợi ý ...

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

     final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox1); 
     final TextView name = (TextView) view.findViewById(R.id.name); 
     final TextView contactId = (TextView) view.findViewById(R.id.contactid); 
     final int pos = position; 
     checkBox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       if(checkBox.isChecked()) 
       { 
        checkList.add(String.valueOf(pos)); 
        nameList.add(name.getText().toString()); 
        contactList.add(contactId.getText().toString()); 
        Log.i("Chk added",String.valueOf(pos)); 
       } 
       else 
       { 
        checkList.remove(String.valueOf(pos)); 
        nameList.remove(name.getText().toString()); 
        contactList.remove(contactId.getText().toString()); 
        Log.i("Un Chk removed",String.valueOf(pos)); 
       } 
      } 
     }); 

     if(checkList.contains(String.valueOf(pos))) 
     { 
      checkBox.setChecked(true); 
     } 
     else 
     { 
      checkBox.setChecked(false); 
     } 

     return view; 
    } 
+0

Chúng ta có thể thấy bất kỳ bộ xử lý nhấp chuột gắn liền với 'ListView'? – sastraxi

+0

@sastraxi: chưa thêm bất kỳ Trình nghe nào vào 'Listview', tôi chỉ đọc trạng thái của tất cả các hộp kiểm khi người dùng nhấp vào nút. –

+1

Cảm ơn bạn rất nhiều. Nó cũng giải quyết được vấn đề với các nút Toggle. – zawhtut

Trả lời

3

Ah, tôi hiểu vấn đề là gì.

Tạo một lớp mới mà kéo dài SimpleCursorAdapter, nói CheckboxSimpleCursorAdapter, và ghi đè getView như vậy:

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 
    CheckBox checkBox = (CheckBox) view.findViewById(R.id.CheckBox1); 
    checkBox.setChecked(getIsThisListPositionChecked(position)); 
    return view; 
} 

Như bạn không sử dụng một bố cục có cấp cao nhất View thực hiện Checkable, bạn phải làm tất cả mọi thứ cho mình . Điều đó bao gồm trạng thái thanh toán bù trừ (trong trường hợp này), vì việc triển khai mặc định được sử dụng lại View đã được kiểm tra - khi bạn được nhập chính xác.

Chỉnh sửa: sử dụng mã mới này và thực hiện phương thức protected boolean getIsThisListPositionChecked(int position) trả về mục hiện có được kiểm tra hay không. Tôi hy vọng tôi đủ rõ ràng - bạn cần phải tìm hiểu xem mục có cần được kiểm tra theo mô hình của bạn hay không và sau đó thiết lập điều đó khi bạn tạo View.

+0

hãy để tôi thử nó .. –

+0

nó bỏ chọn tất cả các mục đã chọn nếu tôi cuộn xuống. Làm cách nào để kiểm tra lại khi người dùng cuộn lại các mục đó? –

+0

Tôi đã cập nhật câu trả lời của mình - xin lỗi vì nó không đầy đủ. Về cơ bản, thay vì 'setChecked (false)', bạn cần phải 'setChecked (bất kể mô hình nào nói trạng thái đã kiểm tra của mục này phải là ngay bây giờ)'. – sastraxi

2

Đó là luôn luôn tốt hơn xem để tái sử dụng. Những gì bạn đang cố gắng để đạt được có thể được thực hiện với một vài tinh chỉnh trong mã của bạn. Bạn cần phải ghi lại các kiểm tra của các hộp kiểm của bạn bằng cách sử dụng một danh sách biến khác (một boolean cho mỗi mục danh sách).

+0

Có, nhưng tôi không muốn người dùng thấy các mục Đã kiểm tra ngay cả khi họ chưa chọn Kiểm tra. –

+0

@Shashank - Ngoài việc thiết lập Chuỗi, bạn cũng phải kiểm tra cụ thể và sau đó đặt trạng thái của hộp kiểm bằng cách sử dụng danh sách biến Kumar được mô tả. –

+0

@Peter Ajtai: Tôi sẽ làm gì với phương pháp này? 'getView'? –

6

một cách khác để buộc không tái sử dụng các quan điểm, thêm dòng sau trong bộ chuyển đổi con trỏ của bạn:

@Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 500; 
    } 

nhưng có, bạn nên sử dụng lại quan điểm bất cứ khi nào có thể. Trong trường hợp cụ thể của tôi, tôi đang thêm hình ảnh vào chế độ xem của mình và không buộc phải không sử dụng lại chế độ xem, chúng sẽ được hiển thị lại trong các chế độ xem được sử dụng lại.

+0

Tôi nghĩ rằng đây là cách tốt nhất để giữ hiệu suất & duy trì chế độ xem không sử dụng lại. –

1

Override hai phương pháp này trong lớp Adapter của bạn

@Override 
public int getViewTypeCount() 
{     
    return getCount(); 

} 

@Override 
public int getItemViewType(int position) 
{ 
return position; 
} 
Các vấn đề liên quan