【发布时间】:2023-03-23 08:57:01
【问题描述】:
当使用 StateListDrawable 作为背景时,我有一些非常奇怪的 ListView 行为。我试图关注this 帖子的答案,因为我没有让 state_checked 状态工作,但现在我的 ListView 快疯了。
当我单击一个项目时,它不会立即将颜色更改为选择器中的 state_checked 项目。但是,在单击了一下之后,许多视图会突然切换到 state_checked 背景。这似乎是随机的。
这是我的状态选择器 xml 代码:
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape>
<gradient
android:startColor="@color/grey"
android:endColor="@color/darkgrey"
android:angle="270" />
<stroke
android:width="0dp"
android:color="@color/grey05" />
<corners
android:radius="0dp" />
<padding
android:left="10sp"
android:top="10sp"
android:right="10sp"
android:bottom="10sp" />
</shape>
</item>
<item android:state_focused="true" >
<shape>
<gradient
android:endColor="@color/orange4"
android:startColor="@color/orange5"
android:angle="270" />
<stroke
android:width="0dp"
android:color="@color/grey05" />
<corners
android:radius="0dp" />
<padding
android:left="10sp"
android:top="10sp"
android:right="10sp"
android:bottom="10sp" />
</shape>
</item>
<item android:state_checked="true">
<shape>
<gradient
android:endColor="@color/brown2"
android:startColor="@color/brown1"
android:angle="270" />
<stroke
android:width="0dp"
android:color="@color/grey05" />
<corners
android:radius="0dp" />
<padding
android:left="10sp"
android:top="10sp"
android:right="10sp"
android:bottom="10sp" />
</shape>
</item>
<item android:state_selected="true">
<shape>
<gradient
android:endColor="@color/brown2"
android:startColor="@color/brown1"
android:angle="270" />
<stroke
android:width="0dp"
android:color="@color/grey05" />
<corners
android:radius="0dp" />
<padding
android:left="10sp"
android:top="10sp"
android:right="10sp"
android:bottom="10sp" />
</shape>
</item>
<item>
<shape>
<gradient
android:startColor="@color/white"
android:endColor="@color/white2"
android:angle="270" />
<stroke
android:width="0dp"
android:color="@color/grey05" />
<corners
android:radius="0dp" />
<padding
android:left="10sp"
android:top="10sp"
android:right="10sp"
android:bottom="10sp" />
</shape>
</item>
</selector>
这是我的 .java 类,用于实现可检查的自定义视图:
public class Entry extends LinearLayout implements Checkable {
public Entry(Context context) {
super(context, null);
// Inflate this view
LayoutInflater temp = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
temp.inflate(R.layout.entry, this, true);
initViews();
}
private static final int[] CheckedStateSet = {
android.R.attr.state_checked
};
private void initViews() {
this.setBackgroundResource(R.drawable.listview_row);
}
public boolean isChecked() {
return _checked;
}
public void toggle() {
_checked = !_checked;
}
public void setChecked(boolean checked) {
_checked = checked;
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CheckedStateSet);
}
return drawableState;
}
@Override
public boolean performClick() {
toggle();
return super.performClick();
}
}
我已经摸索了几个小时试图弄明白,但不幸的是必须承认寻求帮助。任何人都可以看到上面的代码有什么问题会导致 ListView 在项目上出现奇怪的行为吗?如果需要,我也可以发布更多代码。
【问题讨论】:
-
我认为你应该使用 View Wrapper 类