Mis filas contienen un botón que tiene su propio oyente de clic establecido en getView de mi adaptador. Puedo distinguir entre los clics de mi botón y los clics reales de elementos de fila usando android: descenddantFocusability = "blocksDescendants" en el elemento primario de la fila.Android: cambiar el fondo del botón en la fila de ListView con onClick
Cuando hago clic en un botón, establece el fondo del botón correctamente, mi problema es que me desplazo por la lista y también lo configura para diferentes filas. Supongo que es un problema en algún lugar con el reciclaje de vistas.
Aquí está mi código:
@Override
public View getView(int position, View convertView, ViewGroup parent){
if(convertView == null){
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.todays_sales_favorite_row, null);
holder.favCatBtn = (Button)convertView.findViewById(R.id.favCatBtn);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.favCatBtn.setTag(position);
holder.favCatBtn.setOnClickListener(this);
return convertView;
}
@Override
public void onClick(View v) {
int pos = (Integer) v.getTag();
Log.d(TAG, "Button row pos click: " + pos);
RelativeLayout rl = (RelativeLayout)v.getParent();
holder.favCatBtn = (Button)rl.getChildAt(0);
holder.favCatBtn.setBackgroundResource(R.drawable.icon_yellow_star_large);
}
Así que si hago clic en el botón en posición de la fila 1 los cambios botón de fondo como debería. Pero a medida que me desplazo hacia abajo en la lista, al azar se establecen otros botones. Entonces, a veces, cuando me desplazo hacia atrás a la posición 1, el fondo del botón vuelve a volver al original.
¿Qué me falta aquí? Sé que estoy allí, es solo algo menor que no estoy haciendo.
Cuando cambia a if (true || convertView == null) {... (por lo que siempre está inflado), ¿funciona bien entonces? No es una solución, solo quiero saber si el problema ya no aparece. –
Sí, eso evita que el fondo cambie en otras filas aleatorias. Obviamente no es la solución como dijiste, pero sí, detiene el problema hasta que retroceda y el botón vuelva a su fondo original. – askilondz