2016-12-26 4 views
0

CursorLoaderSimpleCursorAdapterを使用して連絡先リストを生成しています。リストの各行には三つの値が含まれます。.. PhoneTypeはint型ですが、私はタイプすなわちモバイル、仕事、家庭などに関連付けられたラベルを表示したい NamePhone、およびPhoneTypeカーソルローダー/カーソルアダーでidをラベルに変換する方法

私はCursorLoaderonLoaderFinished()に列挙し、それぞれのタイプをタイプラベルに変換して結果の値を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); 
    } 

} 

答えて

0

は、生データの値よりもUIに異なる値をバインドするためには、アダプタを作成する必要がありますカスタムのように見えます。 CustomAdapterを作成し、BaseAdapterを拡張してgetView()メソッドでphoneType値を切り替えて、phoneTypeテキストに変換しました。次に、レイアウトにTextViewを設定します。これは、あなたが答えを知っているとき、非常に簡単な解決策であることが分かります。

関連する問題