3

Android バージョン: 3.1
API バージョン: Android 2.2
デバイス: Motorola MX604

CheckedTextView アイテムの複数選択 ListView を動的に作成し、OnItemClickListener を ListView にアタッチします。リスナーの onItemClick メソッドで、CheckedTextView の isChecked メソッドを呼び出して、関連するチェックボックスがオンかオフかを判断します。十分に単純です。

問題: 以前に選択されていない項目を選択すると、isChecked メソッドが false を返します。以前に選択した項目を選択すると、メソッドは true を返します。チェックボックス アイコン自体が正しくチェックおよびチェック解除されます。

CheckedTextView のレイアウトは次のとおりです。

    <CheckedTextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:gravity="center_vertical" 
    android:drawableLeft="?android:attr/listChoiceIndicatorMultiple" 
    android:paddingLeft="6dip" android:paddingRight="6dip" 
    /> 

これは、ListView を作成する方法です。

    private void createSortedChannelList() {

    emptyViewContainer();

    ListView sortedListView = new ListView(this);
    sortedListView.setId(CHANNEL_LISTVIEW_ID);
    sortedListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    sortedListView.setItemsCanFocus(false);

    sortedListView.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,long id) {

            CheckedTextView selectedItem = (CheckedTextView) view;
            boolean isChecked = selectedItem.isChecked();
            Log.e(mLogTag,"item clicked position = " + position + " isChecked = " + isChecked);

        }

    });

    ArrayAdapter<Channel> listAdapter = 
        new ArrayAdapter<Channel>(this,R.layout.favorite_channel_list_select_channel_row,mAllChannels);
    sortedListView.setAdapter(listAdapter);

    for(int channelIndex = 0;channelIndex < mChannelIds.length;channelIndex++){
        if(mSelectedChannelIds.contains(mChannelIds[channelIndex]))
            sortedListView.setItemChecked(channelIndex, true);
    }

    addViewToViewContainer(sortedListView);

}

これは、以前に選択されていない項目を選択したときに生成されるログ出力です。

09-23 09:08:59.650: item clicked position = 19 isChecked = false

そして、以前に選択したアイテムを選択すると

09-23 09:10:20.800: item clicked position = 18 isChecked = true

広範な検索を行いましたが、同様の動作に関する報告は他に 1 つしか見つかりません。これにより、問題はおそらくAndroidクラスではなく、私のコードにあると思われます:p 同様の方法で設定された多数の例も見ました。誰でも問題を見つけることができますか?

ありがとう

PS これはどのフォーラムでも初めての投稿です。この投稿の読者に役立つ情報が不足している場合は、お知らせください。

4

3 に答える 3

3

コードは本来の動作をしていると思います。以前に選択されていないメソッドを選択すると、リスト内の項目のチェック状態を変更する前にクリック リスナーが呼び出されます。つまり、メソッドが終了isChecked()するまで、以前に選択されていなかったアイテムに対して true を返しません。onClick()

于 2011-09-23T17:37:51.780 に答える
2

少なくとも私にとっては、状態が変化したときの動作が一貫していないことに気付きました。エミュレーターでは isChecked() はクリック前の状態を返しましたが、デバイスではクリック後の状態を返しました。

「isChecked」を完全にバイパスし、トグルしている基になるオブジェクトの状態を確認することでこれを回避しました。これは、明示的に変更しない限り変更されないためです。ただし、この解決策は、コードの設定方法に依存する場合があり、見落としている他の落とし穴がある場合があります。

于 2013-09-09T21:57:59.630 に答える
0

MultiChoiceModeListenerチェックを聞くために使用する必要があります。ここにドキュメントがあります

于 2011-09-23T15:30:00.170 に答える