8

CursorAdapter で電話連絡先を表示するアプリケーションを開発しています。私がそれを実行すると、次のように1つの連絡先だけを繰り返すリストビューに直面しました(「デビッド」は私の連絡先の1つで、リストビューで繰り返されました)

デビッド 017224860

デビッド 017224860

デビッド 017224860

デビッド 017224860

デビッド 017224860

デビッド 017224860 .

.

.

.

私の活動は次のようになります

public class Contacts extends Activity {    
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contacts);

    Cursor cursor = getContentResolver()
        .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
               null, null, null, null);

    startManagingCursor(cursor);

    ContactCursorAdapterCT adapter= new ContactCursorAdapterCT(Contacts.this, cursor);
     ListView contactLV = (ListView) findViewById(R.id.listviewblcontactsDB);

    contactLV.setAdapter(adapter);

そして、私のcursorAdapterは次のようになります:

public class ContactCursorAdapterCT extends CursorAdapter {
       public ContactCursorAdapterCT(Context context, Cursor c) {
    super(context, c);
    // TODO Auto-generated constructor stub
}

@Override
public void bindView(View view, Context context, Cursor cursor) {

    while (cursor.moveToNext()) {

        TextView name = (TextView)view.findViewById(R.id.blacklistDB1);               
          name.setText(cursor.getString(cursor.getColumnIndex
          (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));

        TextView phone = (TextView)view.findViewById(R.id.blacklistDB2); 
          phone.setText(cursor.getString(cursor.getColumnIndex
          (ContactsContract.CommonDataKinds.Phone.NUMBER)));

    }
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
    // TODO Auto-generated method stub

    LayoutInflater inflater = LayoutInflater.from(context);

    View v = inflater.inflate(R.layout.lv, parent, false);
            bindView(v, context, cursor);
           return v;
}
4

2 に答える 2

26

私はいくつかの点に気づきました:

  1. CursorAdapter が Cursor を移動し、 への呼び出しを取り出しますcursor.moveToNext()
  2. アダプターのgetView()呼び出しnewView()bindView()それ自体。これらのメソッドを自分で呼び出さないでください。
  3. Google IO での Android 開発者のレクチャーを見て、アダプターの高速化に関するヒントとコツを学んでください。次のようなヒント:
    • 繰り返し呼び出すのではなく、ViewHolder を使用しfindViewById()ます。
    • getColumnIndex()繰り返し呼び出すのではなく、カーソルのインデックスを保存します。
    • LayoutInflater を 1 回フェッチし、ローカル参照を保持します。
于 2012-11-29T17:16:34.667 に答える
4

また、CursorManager の使用から CursorLoader の使用に切り替えることをお勧めします。これは、ローダーの下の Android API ガイドに記載されています。役に立つと思われる特定の例を ここに示します。

Cursor Adapter は、Cursor を ListView に「接続」します。Cursor はデータのデータ ビューであり、ListView は同じデータの UI ビューです。ListView を Cursor と同期させるために何かをプログラムする必要はありません。これはすべて自動的に処理されます。

Cursor のどの列を表示するかを ListView に指示する必要があります。SimpleCursorAdapterクラスのドキュメントを参照してください。Cursor から ListView に移動するときにデータを変更する必要がない限り、通常はそのクラスを使用します。

于 2012-11-29T21:27:19.260 に答える