我的任务是根据ListActivity
创建 ListView 。数据内容来自数据库SimpleCursorAdapter
。
与光标列无关,它必须在每个列表项中显示CheckBox
。用户应根据需要检查多行。当用户完成他的选择时,我必须获得所有已检查的行和它的_id列,因此我必须知道检查了哪些行。
怎么做?
如果没有CheckBoxes
,Listview
功能已经正常工作。
答案 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中