2016-10-28 3 views
2

Wenn wir den Wert in Zeile 1 eingeben, erscheint der in Zeile 1 eingegebene Wert wieder in Zeile 6, wenn wir zu der Zeile 6 blättern. Bitte beachten Sie den folgenden Code und den Rat.Text in Listview Custom Adapter bearbeiten Verliert seine Position beim Scrollen? - C# - Xamarin.Android

namespace Kites 
{ 
public class Marks 
{ 
    // add any if you need more 

    public string StudentName { get; set; } 
    public string MarksScored { get; set; } 
} 

public class TEXTCHECK 
{ 
    public int POS { get; set; } 
    public string Value { get; set; } 
} 

public class MarksListViewAdapter : BaseAdapter<Marks> 
{ 
    private List<Marks> mstuduentmarks; 
    private List<TEXTCHECK> abc = new List<TEXTCHECK>(); 
    private Context mcontext; 

    public MarksListViewAdapter (Context context, List<Marks> stud) 
    { 
     mstuduentmarks = stud; 
     mcontext = context; 
    } 

    public override int Count 
    { 
     get 
     { 
      return mstuduentmarks.Count; 
      //    return mattendence.Count; 

     } 
    } 
    public override long GetItemId (int position) 
    { 
     return position; 
    } 
    public override Marks this[int position] 
    { 
     get 
     { 
      return mstuduentmarks [position]; 
      //    return mattendence [position]; 

     } 
    } 

    class ViewHolder : Java.Lang.Object 
    { 
     public EditText comsevin; 
     public TextView namenmn; 
    } 

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

     ViewHolder holder; 
     View view = convertView; 

     if (view == null) // otherwise create a new one 
     { 
      view = LayoutInflater.From(mcontext).Inflate(Resource.Layout.listview_Marks, null, false); 
      holder = new ViewHolder(); 
      holder.comsevin = view.FindViewById<EditText>(Resource.Id.editTextTeacherMarks); 
      holder.namenmn = view.FindViewById<TextView>(Resource.Id.textStudentNameTeacherMarks); 
      holder.namenmn.Tag = position; 
      view.Tag = holder; 
     } 
     else 
     { 
      holder = (ViewHolder)view.Tag; 
     } 

     holder.namenmn.Text = mstuduentmarks[position].StudentName; 

     int pos = (int)holder.namenmn.Tag; 

     holder.comsevin.TextChanged += (sender, e) => 
     { 
      abc[pos].Value = holder.comsevin.Text; 
     }; 

     //TextView txtStudent = 
     //txtStudent.Text = mstuduentmarks[position].StudentName; 


     //txtMarks.FocusChange += (object sender, View.FocusChangeEventArgs e) => 
     //{ 
     //  //txtMarks.RequestFocusFromTouch(); 

     //  mstuduentmarks[position].MarksScored = txtMarks.Text; 
     //}; 



     holder.comsevin.BeforeTextChanged += (sender, e) => 
     { 
      abc.Add(new TEXTCHECK { POS = position, Value = mstuduentmarks[position].MarksScored }); 
     }; 
     holder.comsevin.AfterTextChanged += (sender, e) => 
     { 
      int a = abc[pos].POS; 
      mstuduentmarks[pos].MarksScored = abc[pos].Value; 
     }; 


     //txtMarks.Tag = position; 
     //txtMarks.TextChanged += TxtMarks_TextChanged; 
     return view; 
    } 

    //void TxtMarks_TextChanged (object sender, Android.Text.TextChangedEventArgs e) 
    //{ 
    // EditText txtMarks = (EditText)sender; 
    // //var position = (int)txtMarks.Tag; 



    //} 
} 
} 

Wenn wir geben Wert in Zeile 1 der in Zeile eingegeben Wert 1 erscheint 6 in Reihe zurück, wenn wir in die Zeile scrollen 6. Bitte beachten Sie den Code unten und Beratung.

Antwort

0

Als Faustregel gilt, wenn Sie Listen in Listenansicht/RecyclerView sehen, die das Dataset nicht widerspiegeln (z. B. Wiederholungen von Elementen), bedeutet dies, dass Sie entweder verschmutzte Ansichten verwenden, die zuvor verwendet wurden, und dann unkorrekt. gebunden, oder einfach mit falschen Positionen während binden

ich sehe, wo man es falsch bekommen:

if (view == null) // otherwise create a new one 
     { 
      view = LayoutInflater.From(mcontext).Inflate(Resource.Layout.listview_Marks, null, false); 
      holder = new ViewHolder(); 
      holder.comsevin = view.FindViewById<EditText>(Resource.Id.editTextTeacherMarks); 
      holder.namenmn = view.FindViewById<TextView>(Resource.Id.textStudentNameTeacherMarks); 


      holder.namenmn.Tag = position;//<------------here!!! 
      view.Tag = holder; 
     } 

TLDR nicht Positionen auf diese Weise sparen Sie.

Was passiert: diese Instanz Ihrer Ansicht von Listview wird wiederverwendet, das manchmal bedeutet, (oft) if (Ansicht == null) wird falsch sein und das bedeutet, Tag-Eigenschaft wird nicht aktualisiert werden für Zeile 6 (oder alle anderen Aufrufe, die wiederverwertete Ansichten verwenden), und Sie verwenden tatsächlich einen schmutzigen Wert.

Sie werden dann versuchen, die Tag-Eigenschaft als Position zu verwenden, aber diesen Tag zu vergessen ist schon schmutzig, wenn die Ansicht

int pos = (int)holder.namenmn.Tag; 

     holder.comsevin.TextChanged += (sender, e) => 
     { 
      abc[pos].Value = holder.comsevin.Text; 
     }; 

recycelt wurde Da Sie Zugriff auf die Position in dieser Methode anrufen sollten Sie sie verwenden direkt

Werfen Sie einen Blick auf diese guide von Java Code Geeks, obwohl es in Java ist, können Sie eine gute Implementierung des alten ViewHolder/ListView-Muster sehen.


hoffe, das hilft

+0

@Harsh die aktualisierte Antwort zu überprüfen, so dass Sie verstehen, was schief gelaufen ist;) – HenriqueMS

+0

Vielen Dank für Ihre Hilfe und Verständnis über meine Frage, Eigentlich habe ich versucht, direkt den Positionswert verwenden, aber immer noch ich bin das gleiche Problem bekommen. –

+0

@HarshBakshi du bist willkommen, ich glaube, dass überall, wo Sie die Variable "pos" verwenden Sie einen schmutzigen Wert bekommen, können Sie die Deklaration der Variablen löschen und überprüfen, dass überall "pos" Sie es in "Position ändern "? Sorry für das Bestehen, das ist wirklich leicht zu vergessen, und das ist genug für eine schlechte Bind – HenriqueMS

Verwandte Themen