Я получаю проблему при select/unselect
снятии изображения в списке. в моем случае,
ByDefault->image color(Yellow) First click->image color(Orange) Second click->image color(Yellow)
Если пользователь щелкает по пути, то отлично, но когда пользователь первый раз нажимает на первое изображение и второй раз нажимает на второе изображение, то оба цвета изображения оранжевые (это проблема).
В моем случае только один цвет изображения оранжевый (означает выбранный) за раз.
selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@drawable/item_focus" /> <item android:drawable="@android:color/transparent" /> </selector>
Макет списка listview
<ImageView android:id="@+id/image" android:layout_width="100dp" android:layout_height="100dp" android:padding="5dp" />
И последний, установите режим выбора списка в SINGLE
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
2. Если вам удастся поддерживать pre HoneyComb, вам придется написать свое собственное средство реализации. Вы делаете это для того, чтобы работать с проверенным состоянием . Возьмем пример с LinearLayout (вы можете сделать то же самое с другими).
package com.example.listviewactivestate; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.Checkable; import android.widget.LinearLayout; public class CustomLinearLayout extends LinearLayout implements Checkable { private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; private boolean checked = false; public CustomLinearLayout (Context context, AttributeSet attrs) { super(context, attrs); } public CustomLinearLayout (Context context) { super(context); } @Override public boolean isChecked() { return checked; } @Override public void setChecked(boolean checked) { this.checked = checked; refreshDrawableState(); // Propagate to childs final int count = getChildCount(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child instanceof Checkable) { ((Checkable) child).setChecked(checked); } } } @Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } @Override public void toggle() { this.checked = !this.checked; } }
Используйте этот пользовательский вид в xml
<?xml version="1.0" encoding="utf-8"?> <com.example.listviewactivestate.CustomLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/selector" > <ImageView android:id="@+id/image" android:layout_width="100dp" android:layout_height="100dp" android:padding="5dp" /> </com.example.listviewactivestate.CustomLinearLayout >
Изменить state_activated
на state_checked
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/item_focus" /> <item android:drawable="@android:color/transparent" /> </selector>
Также установите режим выбора списка для SINGLE
. Если он не работает, добавьте onItemClickEvent
как это
list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub list.setItemChecked(position, true);//make sure click item is set to checked. } });