-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

我解决了问题

如果您在 ListView 中有可点击的视图,只需将其添加到根视图

 android:descendantFocusability="blocksDescendants"
于 2012-07-11T07:00:41.067 回答
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 回答