我使用CursorLoader
和SimpleCursorAdapter
生成聯繫人列表。列表中的每一行都包含三個值: Name
,Phone
和PhoneType
如何將id轉換爲cursorloader/cursoradapter中的標籤
的PhoneType
是一個int,但我想,以顯示與類型,即手機,工作,家庭等相關聯的標籤..
我知道我可以在onLoaderFinished()
枚舉CursorLoader
和翻譯各phonetypes的鍵入的標籤,並把所得到的值的ArrayList。但是,如果我這樣做,我相信我失去了光標的「活結合」的好處,並承擔那麼我消耗額外的系統資源的數組。
我找到了手機型標籤here(在摘要部分),但引用此列會導致無效列錯誤。我嘗試了其他URI,但這是迄今爲止我發現的唯一一個返回聯繫人姓名及其所有相關電話號碼和類型的名稱。基於上面的鏈接,我也不是不明白爲什麼這個URI返回聯繫人的姓名,而不是CONTENT_ITEM_TYPE
或CONTENT_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);
}
}