0

ローカルDBから連絡先の詳細を取得し、名前と番号をCustom ListViewに割り当てるための次のコードがあります

public class Rabtaye extends Activity {

    ListView msgList;
    ArrayList<MessageDetails> details;
    AdapterView.AdapterContextMenuInfo info;

    Cursor cursor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);

        msgList = (ListView) findViewById(R.id.MessageList);
        details = new ArrayList<MessageDetails>();

        MessageDetails Detail = new MessageDetails();

        // String info[] = { Phone.DISPLAY_NAME, Phone.NUMBER, Phone._ID };
        String number = null;
        String name = null;
        try {

            Cursor cursor = getContentResolver().query(
                    ContactsContract.Contacts.CONTENT_URI, null, null, null,
                    null);
            while (cursor.moveToNext()) {
                String contactId = cursor.getString(cursor
                        .getColumnIndex(ContactsContract.Contacts._ID));
                String hasPhone = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (hasPhone.equals("1")) {
                    // You know it has a number so now query it like this
                    Cursor phones = getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + " = " + contactId, null, null);
                    while (phones.moveToNext()) {
                        number = phones
                                .getString(phones
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        name = phones
                                .getString(phones
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        System.out.println(number);

                    }
                    Detail.setName(name);
                    Detail.setNumber(number);
                    details.add(Detail);
                    msgList.setAdapter(new CustomAdapter(details, this));
                    phones.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }




        // Detail.setName(name);
        // Detail.setNumber(number);
        // details.add(Detail);

        msgList.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                TextView s = (TextView) arg1.findViewById(R.id.name);
                String abc = s.getText().toString();
                Toast.makeText(Rabtaye.this, abc, Toast.LENGTH_LONG).show();
            }
        });
    }
}

CustomAdapter は ListAdapter に渡されます。while ループ内にも Name と Number を追加しようとしましたが、ListView には名前と番号が 1 つしか入力されません。私はこれについて少し混乱しています。助けてください!

4

1 に答える 1

1

これは、カーソルを ListView にバインドする方法ではありません。通常、カスタム ListView が必要になるのは、複数のカーソル列から 1 つの UI フィールドを生成する必要がある場合、またはフィールドにバインドする前に列データを処理する必要がある場合のみです。

CursorAdapter は Cursor を ListView にバインドしますが、ListView 内の各エントリまたはアイテムのフォームを定義する「アイテム レイアウト」も指定する必要があります。Cursor の各行に対して、CursorAdapter は Cursor から必要な列をアイテム レイアウト内のフィールドにバインドします。アイテムのレイアウトは、UI 画面の複数の行を占める場合があります。そのように定義するだけです。

あなたがしようとしているのは、電話番号を持つ連絡先ごとに連絡先名と電話番号を表示することだと思います。これを行う最善の方法は、Cursor を取得した後にデータをフィルタリングするのではなく、Cursor の内容を制限することです。

問題は、1 つの連絡先が複数の電話番号を持っている可能性があることです。そのためは、親ビューに電話番号ビューをプログラムで追加するカスタムアダプターが必要になる場合があります。これにより、すべての電話番号とともに名前を 1 回表示できます。

于 2013-03-20T21:04:53.733 に答える