2012-06-06 12 views
5

मैं एंड्रॉइड डिवाइस के संपर्क प्राप्त करने का प्रयास कर रहा हूं। मैं एक महान नमूना कोड hereसंपर्क प्रदर्शन समस्या प्राप्त करें

पाया हालांकि, जब एक ListActivity कि कि कोड का उपयोग कर रहा है यह बहुत समय ले जा रहा है ArrayAdapter साथ पॉप्युलेट करने के लिए कोशिश कर रहा है - और आकाशगंगा s2 पर लगभग 4 सेकंड पुराने उपकरणों पर भी बहुत कुछ। मुझे उस प्रदर्शन को बेहतर बनाने की आवश्यकता है। मैंने सोचा कि Cursor लागू करने वाला है जो एक से अधिक आयाम Cursor रखेगा, और सूची एडाप्टर के रूप में SimpleCursorAdapter का उपयोग करेगा।
मैं इस दृष्टिकोण के साथ कुछ समस्याएं देखें:

  • मैं कैसे विशिष्ट स्थिति में आइटम प्राप्त करने के लिए पता नहीं है।
  • प्रत्येक कर्सर के अलग-अलग कॉलम होते हैं।

क्या ऐसा करने का एक बेहतर/आसान तरीका है?

संपादित करें:

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; 
} 

संपादित करें 2:

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

किसी संपर्क से डेटा के टुकड़ों की पूरी और सटीक सूची क्या है जिसे आप अपनी प्रत्येक 'ListFragment' पंक्तियों में प्रस्तुत करना चाहते हैं? – CommonsWare

+0

मैंने कोड नमूना जोड़ा, उम्मीद है कि यह बताता है (आईडी, नाम, फोन) – oshai

उत्तर

4

आप एक ही समय आप फोन नंबर मिल पर नाम और आईडी प्राप्त कर सकते हैं:

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); 

यह प्रति-पंक्ति उप क्वेरी दूर करता है।

+0

यह काम करता है, धन्यवाद! मैंने इसका इस्तेमाल किया लेकिन सभी उपयोगकर्ताओं के सभी फोन प्राप्त करने के लिए आईडी द्वारा फ़िल्टरिंग को भी हटा दिया। – oshai

3

एक का उपयोग करना:

केवल एक प्रश्न के बदलकर इसे ठीक करने में कामयाब रहे

यहाँ मेरी कोड है इस समस्या के लिए Cursor एक शानदार तरीका है। किसी विशिष्ट स्थिति से जानकारी पुनर्प्राप्त करने के लिए, आप Cursor.moveToPosition(int position) का उपयोग कर सकते हैं। फिर आप का उपयोग करके Cursor के किसी भी क्षेत्र तक पहुंच सकते हैं, इस मामले में String

अधिक जानकारी के लिए Cursor दस्तावेज़ीकरण पर नज़र डालें।

इस दृष्टिकोण के बारे में सबसे अच्छा हिस्सा यह है कि आप अपने लिए पृष्ठभूमि डेटा पुनर्प्राप्ति करने के लिए CursorLoader लागू कर सकते हैं। यह स्वचालित रूप से डेटा परिवर्तन, अभिविन्यास परिवर्तन इत्यादि पर आपके ListView को दोबारा बदलने के लिए स्वचालित रूप से संभालता है। अधिक स्पष्टीकरण के लिए this great tutorial देखें।

+1

कर्सर लोडर एक शानदार तरीका है। एक-दूसरे के अंदर सावधान घोंसले के प्रश्न भी लें। अंत में, आप यह सुनिश्चित करना चाहते हैं कि आप केवल उस जानकारी का चयन करें जो आपको चाहिए। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^