Necesita ayuda con el selector de colores para los elementos de ListView seleccionados
Tengo un ListView con la disposición de encargo para sus artículos y necesito especificar el color de fondo separado para los artículos comprobados usando el selector. Aquí está el selector para los elementos impares:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@android:color/black" /> <item android:state_checked="true" android:drawable="@android:color/black" /> <item android:state_selected="true" android:drawable="@color/red" /> <item android:drawable="@android:color/white" /> </selector>
Y aquí está el selector de los elementos pares:
- Android - Creación de listview con encabezados flotantes
- Control de entrada de archivos HTML con capturar y aceptar atributos funciona mal?
- ¿Cómo obtener el código ISO de país en las aplicaciones de Android?
- Determinar y vincular eventos de clic o "toque"
- Target Platform está deshabilitado en Xamarin Studio?
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@android:color/black" /> <item android:state_checked="true" android:drawable="@android:color/black" /> <item android:state_selected="true" android:drawable="@color/red" /> <item android:drawable="@color/gray" /> </selector>
La plantilla de elemento de ListView se ve así:
<?xml version="1.0" encoding="utf-8"?> <com.androidhub.core.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="40dip"> <TextView android:text="TextView" android:id="@+id/textView1" android:layout_height="fill_parent" android:layout_width="wrap_content" android:gravity="center_vertical" android:textColor="@color/list_item"></TextView> </com.androidhub.core.CheckableLinearLayout>
El elemento raíz del elemento de lista es CheckableLinearLayout: http://paste.org/pastebin/view/28711
ListView tiene modo de opción única (también he probado el modo de opción múltiple, pero también no funciona para mí)
public class MainActivity extends ListActivity { List<String> items = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); items.add("test 1"); items.add("test 2"); items.add("test 3"); items.add("test 4"); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setAdapter(new TestAdapter(this, items)); getListView().setBackgroundColor(getResources(). getColor(android.R.color.white)); } }
En el adaptador para este ListView llamo el método setChecked () de CheckableLinearLayout pero no cambia su color:
@Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(getContext()); View v = convertView; if(v == null) { v = inflater.inflate(R.layout.list_item, null); } if(position % 2 != 0) { v.setBackgroundResource(R.drawable.list_item_even); } else { v.setBackgroundResource(R.drawable.list_item_odd); } if(parent instanceof ListView) { ListView lv = (ListView)parent; if(v instanceof CheckableLinearLayout) { CheckableLinearLayout cll = (CheckableLinearLayout)v; cll.setChecked(lv.isItemChecked(position)); } } return v; }
¿Qué estoy haciendo mal? Puedo ver que el artículo state_pressed del selector trabaja muy bien pero state_checked no. ¿Cuál será el enfoque correcto para configurar el fondo state_checked desde XML, no desde el código?
- ScrollLeft cálculo incorrecto en Firefox Android
- Android TimePicker no se muestra bien en modo horizontal
- ¿Cómo usar la conexión de datos en lugar de WIFI cuando ambos están habilitados?
- ¿Cómo consultar las vistas secundarias de una vista principal con Titanium?
- Forzar el teclado abierto en android
- Cómo implementar la aplicación Phonegap en el iPhone sin tener hardware de Apple (iPhone + Mac)
- Abrir desplegable desde javascript
- ¿Funcionan los tamaños de fuente de escala automáticamente para android, usando el appcelerator?
Creo que estás buscando este atributo:
android:duplicateParentState="true"
Trate de añadirlo a su etiqueta CheckableLinearLayout en el diseño de la celda.
La pulsación / liberación de tecla es el único evento que se propaga a las vistas secundarias de un ViewGroup, por lo que cada vista administrará su propio estado a menos que explícitamente le diga que utilice sus padres.
También, después de este cambio pienso que usted puede apenas quitar el bloque entero del código que fuerza el CheckableLinearLayout para ser comprobado:
if(parent instanceof ListView)...
Intente implementar getListView (). SetOnItemClickListener como este:
OnItemClickListener listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckableLinearLayout r; for(int i = 0; i< lv.getChildCount(); i++) { r= (CheckableLinearLayout)lv.getChildAt(i); if(i==position) r.setChecked(true); else r.setChecked(false); } } };
¿Ha intentado crear un XML para mantener su ListView similar a esto? Hay algo de magia alrededor de la etiqueta @ + id / android: list.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/megaphone_320x480"> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/megaphone_320x480" android:cacheColorHint="@drawable/transparent" /> <TextView android:id="@id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@drawable/red" android:gravity="center_vertical|center_horizontal" android:textStyle="bold" android:text="@string/error_no_groups" /> </LinearLayout>
- ¿Cómo puedo obtener el DisplayMetrics correcto de un AppWidget en Android?
- Cómo hacer que los elementos de la lista obtengan DragEvents después de desplazarse