0

我有以下代码用于从本地数据库中获取联系人详细信息并将名称和号码分配给自定义 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 循环中添加名称和编号,但每次只有一个名称和编号填充到 ListView 中。我对此有点困惑。请帮忙!

4

1 回答 1

1

这不是将光标绑定到 ListView 的方式。一般来说,如果您需要从多个光标列生成一个 UI 字段,或者如果您需要在将列数据绑定到字段之前对其进行处理,则只需要自定义 ListView。

CursorAdapter 将 Cursor 绑定到 ListView,但您还需要指定一个“项目布局”,该布局定义 ListView 中每个条目或项目的形式。对于 Cursor 中的每一行,CursorAdapter 将 Cursor 中所需的列绑定到项目布局中的字段。项目布局可以占据多于一行的 UI 屏幕;您需要做的就是以这种方式定义它。

我认为您要做的是为每个具有电话号码的联系人显示联系人姓名和电话号码。最好的方法是限制光标的内容,而不是在拥有光标后过滤数据。

问题是一个联系人可能有多个电话号码。为此您可能需要一个自定义适配器,以编程方式将电话号码视图添加到父视图。这将允许您显示一次姓名以及所有电话号码。

于 2013-03-20T21:04:53.733 回答