2012-06-06 41 views
5

Tôi đang cố gắng liên hệ với thiết bị Android. Tôi tìm thấy một mẫu mã lớn heregặp vấn đề về hiệu suất liên hệ

Tuy nhiên, khi cố gắng để cư một ListActivity với ArrayAdapter đó là sử dụng mã mà nó được tham gia rất nhiều thời gian - gần 4 giây trên galaxy s2 và nhiều hơn nữa trên thiết bị cũ. Tôi cần cải thiện hiệu suất đó. Những gì tôi nghĩ là để thực hiện Cursor sẽ giữ nhiều hơn một kích thước Cursor và sử dụng SimpleCursorAdapter làm bộ điều hợp danh sách.
tôi thấy vài vấn đề với cách tiếp cận này:

  • Tôi không biết làm thế nào để có được item ở vị trí cụ thể.
  • mỗi con trỏ có các cột khác nhau.

Có cách nào tốt hơn/dễ hơn để làm điều đó không?

EDIT:

đây là mã của tôi:

public List<ContactData> readContacts(){ 
    ContentResolver cr = getContentResolver(); 
    List<ContactData> cd = new ArrayList<ContactData>(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      null, null, null, ContactsContract.Contacts.DISPLAY_NAME); 

    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 

       // get the phone number 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
             new String[]{id}, null); 
       while (pCur.moveToNext()) { 
        String phone = pCur.getString(
          pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        if (!Utils.isEmpty(phone)) { 
         cd.add(new ContactData(id, name, phone)); 
        } 
       } 
       pCur.close(); 


      } 
     } 
    } 
    return cd; 
} 

EDIT 2:

quản lý để sửa chữa nó bằng cách thay đổi nó để chỉ một truy vấn:

public List<ContactData> readContacts(){ 
    ContentResolver cr = getContentResolver(); 
    List<ContactData> cd = new ArrayList<ContactData>(); 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         new String[]{ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY}, 
         ContactsContract.CommonDataKinds.Phone.NUMBER + " IS NOT NULL", 
             null, 
             ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY); 
       while (pCur.moveToNext()) { 
        String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        String id = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)); 
        String name = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY)); 
         ContactData cd1 = contactDataProvider.get(); 
         cd1.id = id; 
         cd1.name = name; 
         cd1.phone = phone; 
         cd.add(cd1); 
       } 
       pCur.close(); 
    return cd; 
} 
+0

Danh sách đầy đủ và chính xác các phần dữ liệu từ một liên hệ mà bạn muốn hiển thị trong mỗi hàng 'ListFragment' của mình là gì? – CommonsWare

+0

Tôi thêm mẫu mã, hy vọng nó giải thích (id, tên, điện thoại) – oshai

Trả lời

4

Bạn có thể có được tên và ID cùng lúc bạn nhận được số điện thoại:

String[] PROJECTION=new String[] {Contacts._ID, Contacts.DISPLAY_NAME, Phone.NUMBER}; 
Cursor pCur = cr.query(Phone.CONTENT_URI, PROJECTION, Phone.CONTACT_ID +" = ?", 
             new String[]{id}, null); 

này loại bỏ sự phụ truy vấn mỗi hàng.

+0

hoạt động, cảm ơn! Tôi đã sử dụng nó nhưng cũng đã xóa bộ lọc theo id để nhận tất cả điện thoại của tất cả người dùng. – oshai

3

Sử dụng một Cursor là một cách tiếp cận tuyệt vời cho vấn đề này. Để lấy thông tin từ một vị trí cụ thể, bạn có thể sử dụng Cursor.moveToPosition(int position). Sau đó, bạn có thể truy cập bất kỳ trường nào của Cursor, trong trường hợp này là String, sử dụng Cursor.getString(int columnIndex).

Hãy xem tài liệu Cursor để biết thêm chi tiết.

Phần tốt nhất về phương pháp này là bạn có thể triển khai CursorLoader để thực hiện truy xuất dữ liệu nền cho bạn. Nó cũng tự động xử lý repopulating ListView của bạn trên thay đổi dữ liệu, thay đổi định hướng, vv Kiểm tra this great tutorial để giải thích thêm.

+1

CursorLoader là def một cách tuyệt vời để làm. Ngoài ra hãy cẩn thận lồng ghép các truy vấn bên trong lẫn nhau. Cuối cùng, bạn muốn đảm bảo rằng bạn chỉ chọn thông tin bạn cần. –

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