2010-12-27 13 views
14

Ich habe eine Listview durch die folgende XML definiert. Ich muss das Bild in der Liste während der Laufzeit wechseln, wenn der Benutzer auf eine Zeile klickt. Wie kann ich das erreichen? Jede Hilfe wird sehr geschätzt. DankAndroid: Dynamisch Bild in Listview ändern

//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> 

Antwort

18

Sie die img Ansicht des Elements lokalisieren kann durch findViewById auf den zweiten Parameter aufrufen (die View des angeklickten Artikel ist) innerhalb des onItemClick Handler:

public void onItemClick(AdapterView parentView, View clickedItemView, int pos, long id) 
{ 
    ImageView imageView = (ImageView) clickedItemView.findViewById(R.id.img); 
    // ... 
} 

EDIT: Beachten Sie, dass Android wieder verwendet Liste Element View Objekte (auch Ansichtsrecycling genannt), so dass der Umschaltstatus jedes Elements zur späteren Verwendung gespeichert werden muss. Der Umschaltstatus jedes Elements muss immer dann aufgerufen werden, wenn eine Listenelementansicht an ein Listenelement zur Anzeige gebunden ist.

Zum Beispiel, hier arbeitet Beispiel einer Aktivität, die das Bild von jedem Punkt Klick schaltet:

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); 
      } 
     }); 
    } 
} 

Die wichtige Teile sind der onItemClick Rückruf und die Überschreibung von getView in MyArrayAdapter zu studieren.

Die getView Methode der Adapter Klasse ist verantwortlich für das Aufblasen des Artikellayouts. In diesem Beispiel nenne ich die getView Methode der Superklasse, um zunächst den Punkt Ansicht vorbereiten, aber dann stelle ich sicher, in geeigneter Weise die Ressourcen-ID des img Ansicht des Elements gesetzt:

imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off); 

Siehe auch: Developing Applications for Android – Gotchas and Quirks

+0

Vielen Dank. Es hat für mich funktioniert. Ich habe lange nach dieser Lösung gesucht, ungefähr einen Monat. Du hast mich gerettet: D – Vivek

+0

Jetzt kann ich die Quelle von Imageview ändern, aber wenn ich unten scrolle und wieder zurückkomme, wird die Bildansicht auf ihre vorherige Quelle zurückgesetzt. Warum passiert dies? Kannst du mir helfen? – Vivek

+1

@ Vivek: Es klingt wie ein Problem der Wiederverwendung von Ansichten. Bitte sehen Sie sich meine aktualisierte Antwort an, da ich ein funktionierendes Beispiel hinzugefügt und einen ausgezeichneten Blog-Beitrag verlinkt habe, in dem die Wiederverwendung von Ansichten durch Android beschrieben wird. –

-1

Verwenden

public void setImageResource (int resId); 

Methode der Imageview-Klasse.

P.S. Meine bisherige Antwort scheint unvollständig, hier ist die gesamte Lösung:

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

helfen Hier ist das Problem der Image erhält. Wie bekomme ich das entsprechende ImageView aus der ListView? Wenn ich ** ImageView iv = (ImageView) Ansicht; ** in OnListItemClick metod erhalte ich class cast Ausnahme. – Vivek

+0

Funktioniert das - ImageView imageView = (ImageView) this.findViewById (R.id.img); – fiction

+1

Nein. Angenommen, ich habe 40 Zeilen in meiner Listenansicht. Alle Bilder enthalten die gleiche ID (d. H. Img). Daher können wir das Handle des ausgewählten ImageView nicht mit einer eindeutigen ID versehen. – Vivek

1

ich dynamisch die Listenansicht generieren und binden dann an die onclickitem Ereignis, um die setimageresource zu tun, wie etwa durch ‚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 .. ich bin spät –

+0

Doesn Angelegenheit. Ich schätze Ihre Bemühungen. – Vivek

+0

Vielen Dank für Ihre Antwort. Ihre Lösung hat mir wirklich geholfen. – Vivek

0

Dies kann so einfach getan werden, Sie müssen nur auf die Position des Listenelements, das vom Benutzer angeklickt wurde, betrachten. Ein gut beschrieben komplette Demo-Code ist als 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; 

    } 

} 

} 

hoffe, dass ich dies für alle :)

Verwandte Themen