AndroidAPIガイドListView
にある例を試してみました。多かれ少なかれ、サンプルのコードをアクティビティにコピーしました(今のところ省略しただけです)。progressbar
ListView
デバイス(Android4.2でNexus7を実行している)にある各連絡先の複製が表示されることを除いて、すべてが機能します。
各連絡先は、で6〜7回複製されlistview
ます。私が使用しているカーソルは、すでに多くの結果を返します(Nexus atmには3つの連絡先しかないため、3つのアイテムしか返さないはずです)。重複をチェックしたときRAW_CONTACT_ID
、重複は常に同じID値を指しています(つまり、3つの一意のIDしか取得できません)。
これは、問題があるのは私のビューコードではないことを示唆しています。
それで、問題は、アダプターで何がうまくいかない可能性があるかということです。
カーソルがすべての連絡先に対して重複を返すのはなぜですか?または、これらの重複が返される原因となるデバイス上の何かがありますか。
SOに関する他の質問を調べましたが、この特定の問題に関する質問はないようです。
パブリッククラスThemeSelectorActivityはListActivityを拡張します LoaderManager.LoaderCallbacks{を実装します private static final String TAG = "ThemeSelector"; //データベースから取得する行(ダミーデータとして使用される連絡先) static final String [] PROJECTION = new String [] {ContactsContract.Data._ID、 ContactsContract.Data.DISPLAY_NAME}; //連絡先を取得するための選択基準 static final String SELECTION = "((" + ContactsContract.Data.DISPLAY_NAME + "NOTNULL)AND(" + ContactsContract.Data.DISPLAY_NAME + "!=''))"; //リストのデータを表示するために使用されているアダプタ SimpleCursorAdapter mAdapter; @オーバーライド public void onCreate(Bundle savedInstanceState) {{ Log.d(TAG、 "作成..."); super.onCreate(savedInstanceState); //リストビューを選択可能に設定します getListView()。setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); //カーソルアダプタの場合、どの列をどのビューに入れるかを指定します String [] fromColumns = {ContactsContract.Data.DISPLAY_NAME}; int [] toViews = {android.R.id.text1}; //simple_list_item_1のTextView //ロードされたデータを表示するために使用する空のアダプタを作成します。 //カーソルにnullを渡し、onLoadFinished()で更新します mAdapter = new SimpleCursorAdapter(this、 android.R.layout.simple_list_item_1、null、 fromColumns、toViews、0); setListAdapter(mAdapter); //ローダーを準備します。既存のものと再接続するか、 //または新しいものを開始します。 getLoaderManager()。initLoader(0、null、this); } //新しいローダーを作成する必要があるときに呼び出されます public Loader onCreateLoader(int id、Bundle args){ //ここで、処理するCursorLoaderを作成して返します //表示されているデータのカーソルを作成します。 新しいCursorLoader(this、ContactsContract.Data.CONTENT_URI、 PROJECTION、SELECTION、null、null); } //以前に作成されたローダーがロードを終了したときに呼び出されます public void onLoadFinished(ローダーローダー、カーソルデータ){ //新しいカーソルを入れ替えます(フレームワークが閉じます //戻ったら古いカーソル。) mAdapter.swapCursor(data); } //以前に作成されたローダーがリセットされ、データが使用できなくなったときに呼び出されます public void onLoaderReset(Loader loader){ //これは、最後のカーソルがonLoadFinished()に提供されたときに呼び出されます //上記はもうすぐ終了します。私たちは自分がいないことを確認する必要があります //長く使用します。 mAdapter.swapCursor(null); } @オーバーライド / ** *選択したテーマのプレビューを表示するアクティビティを開始します * / public void onListItemClick(ListView l、View v、int position、long id){ super.onListItemClick(l、v、position、id); //文字列アイテム=(文字列)getListAdapter()。getItem(position); //Toast.makeText(this、item + "selected"、Toast.LENGTH_LONG).show(); } }