CursorLoader
とSimpleCursorAdapter
を使用して連絡先リストを生成しています。リストの各行には三つの値が含まれます。.. PhoneType
はint型ですが、私はタイプすなわちモバイル、仕事、家庭などに関連付けられたラベルを表示したい Name
、Phone
、およびPhoneType
カーソルローダー/カーソルアダーでidをラベルに変換する方法
を
私はCursorLoader
をonLoaderFinished()
に列挙し、それぞれのタイプをタイプラベルに変換して結果の値をarraylistに入れることができます。しかし、私がそうするならば、私はカーソルの "ライブバインディング"の利点を失うと思うし、私は配列のための追加のシステムリソースを消費すると仮定します。
電話機のタイプラベルhere(要約のセクション)が見つかりましたが、この列を参照すると無効な列エラーが発生します。私は他のURIを試しましたが、これはこれまで私が見つけた唯一のものです。連絡先の名前には、関連する電話番号とタイプがすべて含まれています。上記のリンクに基づいて、私はこのURIがCONTENT_ITEM_TYPE
またはCONTENT_TYPE
ではなく、なぜ連絡先名を返すのかを実際に理解していません。
私には2つの質問があります:(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);
}
}