2016-08-08 40 views
0

Ich bin Anfänger in Xamarin. Ich habe eine Listview, in jeder Zeile gibt es eine Textansicht und eine Bildansicht. Ich habe einen Adaptator dafür geschrieben, Aktivität, alles. Mein Ziel ist, wenn ich auf ein Element in der Listenansicht klicke, wechselt das Bild zu einem anderen.Xamarin ersetzen image imageview Ressource in der Listenansicht

Datenklasse:

class otherLabelListData 
{ 
    private string otherLabel; 
    private int image; 

    public otherLabelListData(string otherLabel, int image) 
    { 
     this.otherLabel = otherLabel; 
     this.image = image; 
    } 

    public string OtherLabel 
    { 
     get { return otherLabel; } 
    } 

    public int Image 
    { 
     get { return image; } 
    } 
} 

Hier ist der Halter Klasse:

class otherHolder 
{ 
    public TextView labelTxt; 
    public ImageView iconImg; 

    public otherHolder(View itemView) 
    { 
     labelTxt = itemView.FindViewById<TextView>(Resource.Id.otherMessageLabel); 
     iconImg = itemView.FindViewById<ImageView>(Resource.Id.otherLabelIcon); 
    } 
} 

Adapter:

class otherLabelListAdapter : BaseAdapter<otherLabelListData> 
{ 
    private JavaList<otherLabelListData> mItems; 
    private Context mContext; 
    private LayoutInflater inflater; 

    public otherLabelListAdapter(Context context, JavaList<otherLabelListData> items) 
    { 
     this.mItems = items; 
     this.mContext = context; 
    } 

    public override Java.Lang.Object GetItem(int position) 
    { 
     return mItems.Get(position); 
    } 


    public override int Count 
    { 
     get 
     { 
      return mItems.Size(); 
     } 
    } 


    public override long GetItemId(int position) 
    { 
     return position; 
    } 


    public override otherLabelListData this[int position] 
    { 
     get 
     { 
      return mItems[position]; 
     } 
    } 


    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 

     if(inflater == null) 
     { 
      inflater = (LayoutInflater)mContext.GetSystemService(Context.LayoutInflaterService); 
     } 

     if(convertView == null) 
     { 
      convertView = inflater.Inflate(Resource.Layout.OtherLabelViewRow, parent, false); 
     } 

     otherHolder holder = new otherHolder(convertView); 
     holder.labelTxt.Text = mItems[position].OtherLabel; 
     holder.iconImg.SetImageResource(mItems[position].Image); 

     return convertView; 
    } 
} 

Die Aktivität:

[Activity(Label = "Activity1", MainLauncher = false, Theme = "@style/Theme.Mt")] 
public class Activity_OtherScreen : Android.Support.V4.App.FragmentActivity 
{ 
    private ListView mListView; 
    private otherLabelListAdapter adapter; 
    JavaList<otherLabelListData> list; 
    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     SetContentView(Resource.Layout.Other_Layout); 

     mListView = FindViewById<ListView>(Resource.Id.otherList); 

     adapter = new otherLabelListAdapter(this, getOthers()); 

     mListView.Adapter = adapter; 

     mListView.ItemClick += MListView_ItemClick; 
    } 


    private JavaList<otherLabelListData> getOthers() 
    { 
     list = new JavaList<otherLabelListData>(); 

     otherLabelListData ot; 

     ot = new otherLabelListData("Label 1", Resource.Drawable.send2display); 
     list.Add(ot); 

     ot = new otherLabelListData("Label 2", Resource.Drawable.send2display); 
     list.Add(ot); 

     ot = new otherLabelListData("Label 3", Resource.Drawable.send2display); 
     list.Add(ot); 

     return list; 
    } 

    private void MListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e) 
    { 
     //.. 
     ??? 
    } 
} 

Ich habe mehr Lösung ausprobiert, aber Bilder wirken nicht wirklich, wenn ich klicke. Bitte geben Sie mir eine Idee! Danke!

Antwort

0

Wenn Sie es ändern wollen whne Sie klicken, müssen Sie ein Click-Ereignis hinzufügen, wenn die convertView Artikel Instanziierung, wie folgt aus:

public override View GetView (int position, View convertView, ViewGroup parent) 
{ 
    if(convertView == null) 
    { 
     convertView = inflater.Inflate(Resource.Layout.OtherLabelViewRow, parent, false); 
     convertView.Click += (object sender, EventArgs e) => { 
      int p = (int)(sender as View).Tag; 
      ChangeImageResource(convertView, p); 
     }; 
    } 
    convertView.Tag = position; 
} 

void ChangeImageResource(View convertView, int position) 
{ 
    otherHolder holder = new otherHolder(convertView); 
    holder.iconImg.SetImageResource(mItems[position].Image); 
} 

Es ist wichtig, dass Sie das Click-Ereignis hinzufügen, wenn die convertView Instanziierung Es gibt also nur einen Eintrag in Ihrer Listenansicht. Dann ist das Tag-Ding, falsches Anrufen zu vermeiden. Wenn Ihre Listenansicht viele Elemente enthält und Sie einen Bildlauf durchführen müssen, kann dies zu Fehlern in der Position führen, da sich diese beim Scrollen ändert. Mit der Tag-Methode stellen Sie sicher, dass Sie die richtige aufrufen.

+0

Ok, in diesem Fall ist es nicht notwendig, diese Methode 'MListView_ItemClick (Objekt Absender, AdapterView.ItemClickEventArgs e)' in Aktivität? – user1223445

+0

Nein, da Sie das Klickereignis direkt in Ihrem Adapter definieren, müssen Sie den Listener nicht in der Aktivität aufrufen. – YumeYume