Puede localizar vista del elemento img
llamando findViewById
en el segundo parámetro (que es el View
del tema hecho clic) dentro del onItemClick
manejador:
public void onItemClick(AdapterView parentView, View clickedItemView, int pos, long id)
{
ImageView imageView = (ImageView) clickedItemView.findViewById(R.id.img);
// ...
}
EDIT: Tenga en cuenta que Android lista reutiliza item View
objetos (también llamado reciclaje de vistas), por lo que el estado de alternancia de cada elemento debe almacenarse para su uso posterior. Se debe acceder al estado de alternancia de cada elemento siempre que una vista de elemento de lista esté vinculada a un elemento de lista para su visualización.
import java.util.Arrays;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
public class SO4539968TestCaseActivity extends Activity {
private static final List<String> ITEM_TEXTS = Arrays.asList(new String[] {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"});
private boolean[] itemToggled;
private class MyArrayAdapter<T> extends ArrayAdapter<T>
{
public MyArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = super.getView(position, convertView, parent);
ImageView imageView = (ImageView) itemView.findViewById(R.id.img);
imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off);
return itemView;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
itemToggled = new boolean[ITEM_TEXTS.size()];
Arrays.fill(itemToggled, false);
ListView listView = (ListView) findViewById(R.id.list_view0);
listView.setAdapter(new MyArrayAdapter<String>(this, R.layout.list_item, R.id.txt, ITEM_TEXTS));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> listView, View itemView, int position, long id) {
itemToggled[position] = ! itemToggled[position];
ImageView imageView = (ImageView) itemView.findViewById(R.id.img);
imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off);
}
});
}
}
Las partes importantes para el estudio son el onItemClick
devolución de llamada y la anulación de getView
en MyArrayAdapter
:
Por ejemplo, aquí se muestra de una actividad que alterna la imagen de cada punto del clic de trabajo.
El método getView
de la clase Adapter
es responsable de inflar el diseño del elemento. En este ejemplo, que llamo el método de la superclase para preparar inicialmente la vista del elemento getView
, pero entonces me aseguro de establecer adecuadamente el ID de recurso de vista del artículo img
:
imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off);
Ver también: Developing Applications for Android – Gotchas and Quirks
Muchas gracias. Funcionó para mí Estuve buscando esta solución durante mucho tiempo, aproximadamente un mes. Me salvaste: D – Vivek
Ahora, puedo cambiar el origen de la Vista de imagen, pero cuando me desplazo hacia abajo y vuelvo, la vista de la imagen se restablece a su fuente anterior. ¿Por qué está pasando esto? ¿Me puedes ayudar? – Vivek
@Vivek: Parece un problema de reutilización de vistas. Consulte mi respuesta actualizada porque agregué un ejemplo de trabajo y me he vinculado a una excelente publicación de blog que describe el reciclaje de vistas de Android. –