可检查列表视图光标数据独立复选框

时间:2012-08-19 16:40:43

标签: android listview

我的任务是根据ListActivity创建 ListView 。数据内容来自数据库SimpleCursorAdapter

与光标列无关,它必须在每个列表项中显示CheckBox。用户应根据需要检查多行。当用户完成他的选择时,我必须获得所有已检查的行和它的_id列,因此我必须知道检查了哪些行。

怎么做?

如果没有CheckBoxesListview功能已经正常工作。

1 个答案:

答案 0 :(得分:1)

一种快捷方式是使用android.R.layout.simple_list_item_multiple_choice。这个代码示例做你想要的(只需注意我使用了Contacts for my Cursor):

public class ListCheck extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_check);

        this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        startManagingCursor(cursor);

        String[] columns = new String[] { ContactsContract.Contacts.DISPLAY_NAME };
        int[] to = new int[] { android.R.id.text1 };

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
                android.R.layout.simple_list_item_multiple_choice, cursor, columns, to);
        this.setListAdapter(adapter);

        Button finishButton = (Button) this.findViewById(R.id.finishButton);
        finishButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                SimpleCursorAdapter adapter = (SimpleCursorAdapter) ListCheck.this.getListAdapter();
                Cursor cursor = adapter.getCursor();

                ListView lv = ListCheck.this.getListView();
                SparseBooleanArray selectedItems = lv.getCheckedItemPositions();
                for (int i = 0; i < selectedItems.size(); i++) {

                    int selectedPosition = selectedItems.keyAt(i);
                    cursor.moveToPosition(selectedPosition);
                    Log.d("", cursor.getString(cursor.getColumnIndex(
                            ContactsContract.Contacts.DISPLAY_NAME))+" is checked");
                    Log.d("", "row id: "+adapter.getItemId(selectedPosition));
                }
            }
        });
    }
}

活动布局:

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

    <Button
        android:id="@+id/finishButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:choiceMode="multipleChoice" />

</LinearLayout>

但是,如果要在每行(图像,副标题......)中添加其他自定义数据,则必须使用CheckedTextView为行创建自定义布局。 CheckedTextView确实是关键,因为android.R.layout.simple_list_item_multiple_choice使用了它。

请按照以下示例:

<com.mfp.tests.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <CheckedTextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    />

    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="added a data: subtitle"/>

</com.mfp.tests.CheckableLinearLayout>

最后一件事:我使用自定义布局而不是LinearLayout。 为了使CheckedTextView的复选框响应(当您点击一行时自动选中或取消选中),布局必须实现Checkable(并且LinearLayout不会),因此您必须复制此link中的CheckableLinearLayout类:

PS:如果您想尝试上面的代码,请不要忘记将<uses-permission android:name="android.permission.READ_CONTACTS" />放在Manifest.xml中