2016-12-26 25 views
0

我使用CursorLoaderSimpleCursorAdapter生成聯繫人列表。列表中的每一行都包含三個值: NamePhonePhoneType如何將id轉換爲cursorloader/cursoradapter中的標籤

PhoneType是一個int,但我想,以顯示與類型,即手機,工作,家庭等相關聯的標籤..

我知道我可以在onLoaderFinished()枚舉CursorLoader和翻譯各phonetypes的鍵入的標籤,並把所得到的值的ArrayList。但是,如果我這樣做,我相信我失去了光標的「活結合」的好處,並承擔那麼我消耗額外的系統資源的數組。

我找到了手機型標籤here(在摘要部分),但引用此列會導致無效列錯誤。我嘗試了其他URI,但這是迄今爲止我發現的唯一一個返回聯繫人姓名及其所有相關電話號碼和類型的名稱。基於上面的鏈接,我也不是不明白爲什麼這個URI返回聯繫人的姓名,而不是CONTENT_ITEM_TYPECONTENT_TYPE

我有兩個問題:(1)有沒有辦法將ID轉換爲相應的標籤,而不必枚舉光標並手動轉換爲標籤? (2)如果必須枚舉,我必須將結果放在ArrayList中,還是有辦法將未綁定的「標籤列」添加到光標?

下面是相關代碼:

import static android.Manifest.permission.READ_CONTACTS; 

public class MainActivity extends AppCompatActivity 
     implements LoaderManager.LoaderCallbacks<Cursor> { 

    private static String[] LOADER_PROJECTION_CONTACTS = new String[] { 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
      ContactsContract.CommonDataKinds.Phone.TYPE, 
      ContactsContract.CommonDataKinds.Phone._ID}; 

    private static String[] ADAPTER_PROJECTION_CONTACTS = new String[] { 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
      ContactsContract.CommonDataKinds.Phone.TYPE}; 

    SimpleCursorAdapter adapter; 
    int CONTACTS_LOADER = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     int perm = ContextCompat.checkSelfPermission(this, READ_CONTACTS); 
     if (perm != PackageManager.PERMISSION_GRANTED) 
      ActivityCompat.requestPermissions(this, new String[]{READ_CONTACTS}, 1); 
     else { 
      adapter = new SimpleCursorAdapter(
        this, 
        R.layout.contacts_listview_item, 
        null, 
        ADAPTER_PROJECTION_CONTACTS, 
        new int[]{R.id.txt_contact_name, R.id.txt_contact_phone, R.id.txt_contact_type}, 
        0); 

      ListView listview_contacts = (ListView) findViewById(R.id.list_contacts); 
      listview_contacts.setAdapter(adapter); 

      getSupportLoaderManager().initLoader(CONTACTS_LOADER, null, this); 
     } 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle) 
    { 
     return new CursorLoader(
       this, 
       ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
       LOADER_PROJECTION_CONTACTS, 
       ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " NOT LIKE '#%'", 
       null, 
       ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + "," + 
       ContactsContract.CommonDataKinds.Phone.TYPE); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     adapter.swapCursor(cursor); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     adapter.swapCursor(null); 
    } 

} 

回答

0

爲了不同的值綁定到比原始數據值的用戶界面,它看起來像必須創建一個自定義適配器。我創建了一個CustomAdapter,擴展了BaseAdapter,然後在getView()方法中,切換/引入phoneType值以將其轉換爲phoneType文本。然後我相應地在佈局中設置TextView。事實證明,這是一個非常簡單的解決方案......當你知道答案的時候。