2010-12-27 24 views
14

Tengo una vista de lista definida por el siguiente xml. Necesito alternar la imagen en la lista durante el tiempo de ejecución cuando el usuario hace clic en cualquier fila. ¿Cómo puedo conseguir esto? Cualquier ayuda es muy apreciada. GraciasAndroid: cambie dinámicamente la imagen en Listview

//list_item.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
<ImageView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:src="@drawable/play" 
android:id="@+id/img" 
/> 
<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center_vertical" 
android:id="@+id/txt" 
/> 
</LinearLayout> 

Respuesta

18

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

+0

Muchas gracias. Funcionó para mí Estuve buscando esta solución durante mucho tiempo, aproximadamente un mes. Me salvaste: D – Vivek

+0

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

+1

@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. –

-1

Uso

public void setImageResource (int resId); 

método de la clase ImageView.

P.S. Mi respuesta anterior parece incompleta, aquí está la solución completa:

ImageView imageView = (ImageView) this.findViewById(R.id.img); 
       ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 
       imageView.setImageResource(R.drawable.new_image); 
       imageView.invalidate(); 
+0

Aquí el problema es conseguir el ImageView. ¿Cómo obtengo el ImageView correspondiente de ListView? Cuando lo hago ** ImageView iv = (ImageView) ver; ** en el método OnListItemClick obtengo una excepción de clase. – Vivek

+0

Funciona esto - ImageView imageView = (ImageView) this.findViewById (R.id.img); – fiction

+1

No. Porque, supongamos que si tengo 40 filas en mi vista de lista, todas las imágenes contendrán el mismo ID (es decir, img). Por lo tanto, no podemos obtener el control del ImageView seleccionado con una identificación única. – Vivek

1

voy a generar dinámicamente la vista de lista y luego unirse al evento onclickitem, con el fin de hacer la setimageresource como decir por 'Kiril Kirilov'.

12
listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      ImageView imageView=arg1.findViewById(R.id.img); 
      imageView.setImageResource(R.drawable.new_image); 

     } 

    }); 
+0

oops .. llego tarde –

+0

No importa. Le agradezco su esfuerzo. – Vivek

+0

Muchas gracias por su respuesta. Tu solución realmente me ayudó. – Vivek

0

Esto se puede hacer tan fácilmente que solo necesita ver la posición del elemento de la lista que el usuario hizo clic. Un código de demostración completa así descrito es el below_

public class ChangeImageInListDynamically extends Activity { 
/** 
* Adapter for your data. 
*/ 
ImageAdapter adpAR; 
ArrayList<String> itemList; 
ListView mListView; 
ImageAdapter mAdapter; 

/** 
* Indicate which item is currently selected. 
* Its default selected item is '0' e.g., 1st item. 
*/ 
private int selectedPosition=0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    itemList = new ArrayList<String>(); 
    for (int i = 0; i < 11; i++) { 
     itemList.add("Item - "+i); 
    } 

    mListView = (ListView)findViewById(R.id.data_list); 

    //Initialize your adapter 
    mAdapter = new ImageAdapter(nChangeImageInListDynamically.this, itemList); 

    //set adapter to your list. 
    mListView.setAdapter(mAdapter); 

    //set list click listener. 
    mListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> av, View view, int position, long id) { 
      //your image that need to change dynamically. 
      ImageView imageView = (ImageView) view.findViewById(R.id.select); 

      //position of clicked item. 
      selectedPosition=position; 

      //change image of respective image. 
      imageView.setImageResource(R.drawable.selected); 

      //notify your adapter to update your list. 
      adpAR.notifyDataSetChanged(); 
     } 
    }); 

} 

static class ViewHolder { 
    TextView title; 
    ImageView img;     
} 

/** 
* Your ImageAdapter. 
*/ 
public class ImageAdapter extends BaseAdapter { 

    ArrayList<String> dataList; 
    Context context; 

    public ImageAdapter(Context context, ArrayList<String> arrayList) { 
     this.context = context; 
     this.dataList = arrayList; 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return dataList.size();; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     final ViewHolder holder; 
     Log.d("posiiton ImageAdapater : ",""+position); 
     if (row == null) { 
      LayoutInflater inflater = ChangeImageInListDynamically.this.getLayoutInflater(); 
      row = inflater.inflate(R.layout.listrow, null); 

      holder = new ViewHolder(); 
      holder.title = (TextView) row.findViewById(R.id.text); 
      holder.img = (ImageView) row.findViewById(R.id.select); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 

     //set titel text. 
     holder.title.setText(dataList.get(position)); 

     //Change Image of selected item dynamically. 
      if(selectedPosition == position) { 
       //Item is selected. 
       holder.img.setImageResource(R.drawable.selected); 

      }else{ 
       //Other non-selected items. 
       holder.img.setImageResource(R.drawable.dis_selected); 

      } 

     return row; 

    } 

} 

} 

espero que esto ayudará a todos :)

Cuestiones relacionadas