3

ListViewに使用しているカスタムアダプタを使用しています。ArrayListを作成した後

WifiListAdapter<WifiListItem> adapter = new WifiListAdapter<WifiListItem>(
            this, R.layout.listview_item_text, listItems);

私のアプリには次のコードがあります。

    ListView listView = (ListView) findViewById(android.R.id.list);
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    listView.setAdapter(adapter);

ただし、チェックボックスをクリックしようとしても何も起こりません。したがって、チェックボックスの状態を手動で切り替える必要があります。

    protected void onListItemClick(ListView l, View v, int position, long id) {
    CheckedTextView checkBox = (CheckedTextView) v
            .findViewById(R.id.text1);
    if (checkBox != null) {
        checkBox.toggle();

その後、それは動作します。(その前に、setChoiceModeメソッド呼び出しを削除する必要があります)

では、何が問題になるのでしょうか。なぜ効果がないのですか?

私のR.layout.listview_item_text.xml

    <TextView
    android:id="@+id/topText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="22sp"
    android:paddingTop="7dp"
    android:textColor="?android:attr/textColorPrimary"/>

<TextView
    android:id="@+id/botText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="17sp"
    android:paddingTop="2dp"
    android:paddingBottom="7dp"
    android:textColor="?android:attr/textColorTertiary"
 />

私のアダプターでは、チェックボックスのレイアウトを次のコードで膨らませています。

                convertView = mInflater.inflate(
                        R.layout.listview_item_checkbox, null);

            CheckedTextView checkbox = ((CheckedTextView) convertView
                    .findViewById(R.id.text1))

listview_item_checkbox.xml

    <CheckedTextView
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textSize="22sp"
    android:paddingTop="7dp"
    android:paddingBottom="7dp"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
     />
4

3 に答える 3

3

コードの代わりに:

if (checkBox != null)
        checkBox.toggle();

次のようなものを試してください。

if (checkBox != null) checkBox.setChecked(l.getCheckedItemPositions().get(position));

可能であれば-yurコードを改善します(CheckableFrameLayoutリストアイテムの親レイアウトとして作成します)。チェックされた位置のBooleanSparseArrayListViewを保持します(メソッドgetCheckedItemPositions()で取得できます)。コード(grepcode)では、がCheckableを実装している場合にのみ、それ自体がcheckedかどうかを設定します。作成してメインの親として座っている場合は、アダプターでこれらのケースを処理する必要はありません。ViewViewCheckableFrameLayout

于 2012-12-20T11:20:28.563 に答える
2

Checkableを実装するウィジェットを使用する必要があると思います。で試してくださいandroid.R.layout.simple_list_item_multiple_choice。2行が必要な場合は、同様のものを実装します。

于 2012-12-20T09:27:59.320 に答える
0

問題は、ソースコードに問題があることです(この回答を書いている時点での最新バージョンのイベント、4.3r2.1)。ここに問題があります:

1899        if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
1900            if (child instanceof Checkable) {
1901                ((Checkable) child).setChecked(mCheckStates.get(position));
1902            } else if (getContext().getApplicationInfo().targetSdkVersion
1903                    >= android.os.Build.VERSION_CODES.HONEYCOMB) {
1904                child.setActivated(mCheckStates.get(position));
1905            }
1906        }

ソースコード: http: //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/widget/ListView.java?av = f

minSDKが11の場合、質問に対する最も簡単な答えは、次のようにチェックボックスをカスタマイズすることです。

<?xml version="1.0" encoding="utf-8"?>
<selector
 xmlns:android="http://schemas.android.com/apk/res/android" >
 <item android:state_activated="true" android:drawable="@drawable/checkbox_selected"/>
 <item android:state_activated="false" android:drawable="@drawable/checkbox_deselected" />
 <item android:state_checked="false" android:drawable="@drawable/checkbox_deselected" />
 <item android:state_checked="true" android:drawable="@drawable/checkbox_selected" />
</selector>

それをxmlファイルとしてドローアブルフォルダに保存し、レイアウトとして参照します。

中間レベルのソリューションはItemClickListenerに設定され、選択モードに応じて異なる動作を実行します。

動作するソースコードは次のとおりです: https ://github.com/jiahaoliuliu/CustomizedListRow

そして、難しいが正しい解決策は、MarvinLabからのものであり、ここで見つけることができます:http: //www.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/

関連する問題: Androidで選択、チェック、アクティブ化された状態の違いは何ですか?

于 2013-09-04T14:00:53.277 に答える