0

私の仕事は、に基づいてListViewListActivityを作成することです。データコンテンツはデータベースから取得されますSimpleCursorAdapter

カーソル列とは関係なくCheckBox、各リストアイテムにを表示する必要があります。ユーザーは、必要な数の行をチェックする必要があります。ユーザーが選択を終えたら、チェックされたすべての行とそれが_id列であるため、どの行がチェックされたかを知る必要があります。

どうやってするの?

機能がなくCheckBoxesても、Listviewすでに正常に動作しています。

4

1 に答える 1

1

簡単な方法の1つは、を使用することandroid.R.layout.simple_list_item_multiple_choiceです。このコード例はあなたが望むことをします(私がカーソルに連絡先を使用したことに注意してください):

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>

ただし、各行(画像、サブタイトルなど)内に他のカスタムデータを追加する場合は、を使用して行のカスタムレイアウトを作成する必要がありますCheckedTextViewCheckedTextViewによって使用されるため、ここで実際に重要なのは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は実装しません)。したがって、このリンクCheckableLinearLayoutからクラスをコピーする必要があります。

<uses-permission android:name="android.permission.READ_CONTACTS" />PS:上記のコードを試したい場合は、Manifest.xml内に配置することを忘れないでください

于 2012-08-19T20:21:31.353 に答える