-3

リストビューにチェック可能なアイテムがあります

public class CheckableMessageOut extends RelativeLayout implements Checkable{
    public CheckableMessageOut(Context context) {
        super(context);
    }

    public CheckableMessageOut(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    LinearLayout wrapper;
    private boolean checked = false;

    @Override
    public void setChecked(boolean b) {
        if (checked!=b){
            if (b){
                wrapper.setBackgroundResource(R.drawable.label_msg_out_selected);
            } else {
                wrapper.setBackgroundResource(R.drawable.label_msg_out);
            }
        }
        checked = b;
    }

私はこのように使用します

<ru.kurganec.vk.messenger.ui.helper.CheckableMessageOut xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"

        >
    <LinearLayout
            android:id="@+id/wrapper"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="@drawable/label_msg_out"
            android:orientation="vertical">
        <TextView
                android:id="@+id/text_msg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:text="ad"

                />
        <LinearLayout
                android:id="@+id/list_attach"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:orientation="vertical">
        </LinearLayout>
    </LinearLayout>

    <TextView
            android:id="@+id/text_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/wrapper"

            android:text="06.06"/>

</ru.kurganec.

vk.messenger.ui.helper.CheckableMessageOut>

プログラムで@id/ list_attachにビューを追加すると、何かが発生することがあります。ビューが添付されているアイテムを選択できません。

全体こんな感じです。

写真付きのメッセージは選択できませんが、他のメッセージ(写真なし)は選択できます

選択されたと言うことで、私はチェックされたことを意味します。このフィールドを設定しましたmList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

アイテムを選択できないのはなぜですか?


アップデート

フラグメントクラスhttp://pastebin.com/BZRhahbiこれは私のアプリの主要部分なので、「神クラス」のアンチパターンのように見えます

アダプタークラスhttp://pastebin.com/Av7ntUmG

アダプターのアイテムクラスhttp://pastebin.com/MdYc7Ksw

4

3 に答える 3

0

私はあなたの問題がここにあるかもしれないと思います:

@Override
    public void setChecked(boolean b) {
        if (checked!=b){
            if (b){
                wrapper.setBackgroundResource(R.drawable.label_msg_out_selected);
            } else {
                wrapper.setBackgroundResource(R.drawable.label_msg_out);
            }
        }
        checked = b;
    }

試す:

@Override
    public void setChecked(boolean b) {
        if (checked!=b){
                wrapper.setBackgroundResource(R.drawable.label_msg_out_selected);
              else {
                wrapper.setBackgroundResource(R.drawable.label_msg_out);
            }
        }
        checked = b;
    }

if(b)は不要なコードです。

于 2012-07-06T01:15:15.920 に答える
0

この動作を実現するためのより良い方法は、StateListDrawableを使用することだと思います。このようにして、システムは状態の変化中にドローアブルの切り替えを処理します。このようなドローアブルはXMLを介して定義できます。

たとえば、res / drawable / item_bg.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/item_bg_checked" android:state_checked="true"/>
    <item android:drawable="@drawable/item_bg_normal" android:state_checked="false"/>

</selector>

チェック可能なレイアウトのバックグラウンドリソースとして設定します。

<ru.kurganec.vk.messenger.ui.helper.CheckableMessageOut xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/item_bg">

チェック可能なレイアウトコードは次のようになります。

public class CheckableMessageOut extends RelativeLayout implements Checkable{
public CheckableMessageOut(Context context) {
    super(context);
}

public CheckableMessageOut(Context context, AttributeSet attrs) {
    super(context, attrs);
}

LinearLayout wrapper;
private boolean checked = false;

@Override
protected int[] onCreateDrawableState(int extraSpace) {
    if (checked) {
        final int[] states = super.onCreateDrawableState(extraSpace + 1);
        mergeDrawableStates(states,
                new int[] { android.R.attr.state_checked });
        return states;
    }
    return super.onCreateDrawableState(extraSpace);
}

@Override
public void setChecked(boolean c) {
    if (checked != c) {
        checked = c;
        refreshDrawableState();
    }
}

必ずonCreateDrawableState(int)メソッドをオーバーライドし、必要に応じて状態android.R.attr.state_checkedをドローアブル状態配列に追加し、チェック状態が変更されたときにrefreshDrawableState()を呼び出します。

ご不明な点がございましたら、こちらの記事をご覧ください。

于 2012-07-06T07:09:34.667 に答える
0

私は問題を解決しました

ListViewにクリック可能なビューがある場合は、これをルートビューに追加するだけです。

 android:descendantFocusability="blocksDescendants"
于 2012-07-11T07:00:41.067 に答える