2011-12-06 65 views
1

只是我想我可以使用一些光的几个问题。到目前为止,我有一个应用程序查询Android联系人数据库中的某些类型的数据(当前DISPLAY_NAME,NUMBER和ADDRESS)。然后我想用我的游标查询的结果填充一个ListView。我的问题是,我用3个独立的游标来获取数据,并且我想将所有3组绑定到我的ListView行中的条目(R.id.contact_name,R.id.contact_number,R.id.联系地址)。Android使用multipe游标填充listview

我不确定如何使用3种不同的游标来做到这一点,并且在过去几天环顾四周后,除了像使用“MergeCursor?”( sp)或试图将数据库表连接在一起。另外,我不想在onCreate()中填充我的列表。我想在AsyncTask的doInBackground()里面做,因为有些用户可能有很多很多的联系人,我不想阻止UI线程......这已经发生了。但是当我试图在Async中实现人口时,Eclipse给我提供了很多关于我的SimpleCursorAdapter的错误。这是我目前的代码。任何有关如何改善这种架构和解决我遇到的问题的指导将非常感谢,谢谢!

 public class Contacts extends ListActivity { 

    private static final String TAG = "Contacts"; 

    Cursor c, pCur, addrCur; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Uri contacts = ContactsContract.Contacts.CONTENT_URI; 
    ContentResolver cr = getContentResolver(); 

    String[] projection = new String[] { ContactsContract.Data.DISPLAY_NAME }; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
      + " COLLATE LOCALIZED ASC"; 
    Log.d(TAG, "Getting Display Names...."); 

    // Query the Contacts Content Provider for ONLY Contacts that have phone 
    // numbers 
    // listed 

    c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, null, 
      sortOrder); 
    // Get their display names 
    if (c.getCount() > 0) { 
     // While there is more data 
     while (c.moveToNext() 
       && Integer 
         .parseInt(c.getString(c 
           .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      String id = c.getString(c 
        .getColumnIndex(ContactsContract.Contacts._ID)); 

      String name = c 
        .getString(c 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      // Query Phone Numbers Next 

      /* 
      * if (Integer .parseInt(c.getString(c 
      * .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) 
      * > 0) { Log.d(TAG, "Getting Phone Numbers"); pCur = cr.query(
      * ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
      * ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" , 
      * new String[]{id}, null); while (pCur.moveToNext()) { 
      * 
      * String phone_number = pCur .getString(pCur 
      * .getColumnIndex(ContactsContract 
      * .CommonDataKinds.Phone.NUMBER)); } pCur.close(); Log.d(TAG, 
      * "Finished Getting Phone Numbers...."); } 
      */ 

      // Query the Addresses 
      Log.d(TAG, "Getting Addresses...."); 
      String addrWhere = ContactsContract.Data.CONTACT_ID 
        + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 

      String[] addWhereParams = new String[] { 
        id, 
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }; 

      addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null, 
        null, null, null); 

      while (addrCur.moveToNext()) { 
       String poBox = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); 

       String street = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 

       String city = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 

       String state = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 

       String postalCode = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 

       String country = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 

       String type = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); 

      } 
      addrCur.close(); 
      Log.d(TAG, "Finished Getting Addresses...."); 

     } 
    } 
    // new loadContacts().execute(TAG); 
    final int[] TO = { R.id.contact_name }; 
    final String[] FROM = new String[] { ContactsContract.Contacts.DISPLAY_NAME }; 

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.contact_item, c, FROM, TO); 
    setListAdapter(adapter); 
    // adapter.changeCursor(pCur); 


} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    c.moveToPosition(position); 

    String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

    Toast.makeText(this, "You Selected " + name, Toast.LENGTH_SHORT).show(); 





    //Toast t = Toast.makeText(Contacts.this, "You Selected " + position, Toast.LENGTH_SHORT); 
    //t.show(); 
} 

}

+0

我想你最好为ListView定义自己的适配器,并将你的查询结果合并到适配器中。 –

回答

0

MergeCursor更用于与另一组的结果concatonating一个查询的结果。把它看作更多的行,而不是更多的列。

如果您从多个来源提取,因为您想从每个查询(来自一个电话号码,另一个地址),您要使用的是CursorJoiner。一个CursorJoiner会让你获得两个按相同主键排序的游标,并用每个父游标所需的列创建一个新的游标。链接文档中包含简要的操作概述。

祝你好运!

编辑:要回答关于在单独的线程上运行查询的位,一个好的地方开始将是读取Loaders

+0

谢谢Alex,会看看!此外,你有任何想法在单独的线程中填充列表?我不想在创建时这样做,因为它滞后于用户界面。再次感谢! –

+0

肯定 - 更新答案以包含有用的链接。 –