Mam bardzo dziwne zachowanie ListView podczas używania StateListDrawable jako tło. Próbowałem postępować zgodnie z odpowiedzią na this post, ponieważ nie działał stan state_checked, ale teraz mój ListView szaleje.Dziwne zachowanie elementu ListView i tła selektora stanu do rysowania
Po kliknięciu elementu nie zmienia on natychmiast koloru elementu sprawdzanego przez stan w selektorze. Jednak po krótkim kliknięciu wiele widoków nagle przejdzie na tło sprawdzane przez state_check. Jest pozornie przypadkowa.
Oto mój stan kodu selektor 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>
I tu jest moja klasa .java dla mojego widoku niestandardowego wdrażania Rejestrowalne:
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();
}
}
jakie wysunął się za kilka godzin próbując aby to zrozumieć, ale niestety musi przyznać się do prośby o pomoc. Czy ktoś może zobaczyć coś nie tak z powyższym kodem, który mógłby spowodować dziwne zachowanie się ListView na przedmiotach? W razie potrzeby mogę też dodać więcej kodu.
Myślę, że powinieneś użyć View Wrapper class – Nitin