1

我正在尝试将我的联系人放在列表视图中。现在我知道 usingsimple_list_item_multiple_choice可以让我选择多个联系人,但它只查看没有数字的姓名。

另一方面,simple_list_item_2可用于显示姓名和号码,但支持仅选择一个联系人。

有没有将它们结合起来的模板?如果没有,我如何构建具有这两个功能的自定义列表?

编辑:这是我正在使用的代码

CursorLoader cl = new CursorLoader(this,ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC");
Cursor c = cl.loadInBackground();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, // Use a template
                                                         // that displays a
                                                         // text view
                    c, // Give the cursor to the list adapter
                    new String[] { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},
                    new int[] { android.R.id.text1},0); 

setListAdapter(adapter);

这里 SimpleCursorAdapter 的第二个参数是,simple_list_item_multiple_choice但它只支持处理android.R.id.text1. 所以我只能使用项目,不能使用子项目。

但是在下面的代码中

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_2, // Use a template
                                                         // that displays a
                                                         // text view
                    c, // Give the cursor to the list adapter
                    new String[] { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ,ContactsContract.CommonDataKinds.Phone.NUMBER},
                    new int[] { android.R.id.text1,android.R.id.text2},0); 

我可以同时给它ContactsContract.CommonDataKinds.Phone.DISPLAY_NAMEandNUMBER写成android.R.id.text1and android.R.id.text2,但不能使用多项选择功能。

4

2 回答 2

2

正如Dipu所说,您应该制作自己的自定义布局。要显示姓名和联系人,您需要两个文本视图和一个用于检查的复选框。

您可以从本教程开始编码:

http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html

向 country_info.xml 添加一个文本视图将解决您的问题。

添加

要使用自定义列表视图布局,您必须实现自己的适配器。

本教程(2. 自定义 ArrayAdapter 示例)将帮助您弄清楚如何做到这一点。

http://www.mkyong.com/android/android-listview-example/

于 2012-09-22T11:17:42.097 回答
0

Heejin 提供的答案非常好,但实现自定义 ArrayAdaptor 并不重要。我只需要编写一个自定义布局并将其发送给SimpleCursorAdaptor构造函数。

自定义布局表示列表视图中每个项目的布局。我需要每一行包含一个CheckedTextView和另一个小TextView的子项。所以我制作了一个名为 row_view.xml 的布局,其内容如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <CheckedTextView
        android:id="@+id/checkedTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:text="CheckedTextView" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</LinearLayout>

然后我刚刚在构造函数中使用了它

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row_view, // Use a template
                                                         // that displays a
                                                         // text view
                    c, // Give the cursor to the list adapter
                    new String[] { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER},
                    new int[] { R.id.checkedTextView, R.id.textView},0); 

setListAdapter(adapter);

这是完整的代码

public class MultipleContacts extends ListActivity implements OnItemClickListener {
    private static final String[] PROJECTION = new String[] {
        ContactsContract.CommonDataKinds.Phone._ID
        ,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
        ,ContactsContract.CommonDataKinds.Phone.NUMBER
    };

    SimpleCursorAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.multiple_contacts);
        getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        getListView().setOnItemClickListener(this);
        // Get a cursor with all people

        CursorLoader cl = new CursorLoader(this,ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                PROJECTION, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC");

        Cursor c = cl.loadInBackground();
        adapter = new SimpleCursorAdapter(this,
                R.layout.row_view, // Use a template
                                                     // that displays a
                                                     // text view
                c, // Give the cursor to the list adapter
                new String[] { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER},
                new int[] { R.id.checkedTextView, R.id.textView},0); 

        setListAdapter(adapter);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        //what to do when an item is clicked
        CheckedTextView checkedTextView = (CheckedTextView) v.findViewById(R.id.checkedTextView);
        Toast.makeText(this, checkedTextView.getText(), Toast.LENGTH_SHORT).show();
    }   
}

请注意,我有两种布局,一种用于列表视图本身(称为multiple_contacts),此处提供的布局(称为row_view)是列表视图中每个项目的布局。我所需要的multiple_contacts就是写setContentView(R.layout.multiple_contacts);

于 2012-09-22T14:04:41.223 回答