2016-10-28 1 views
2

行1に値を入力すると、行1に入力された値が行6にスクロールして6行目に表示されます。以下のコードとアドバイスを参照してください。リストビューのテキストを編集するカスタムアダプタースクロール中に位置が失われますか? - 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; 



    //} 
} 
} 

我々は以下のコードやアドバイスをご覧ください行6までスクロールすると、行1行1に入力された値の値は、行6に戻って表示されて入力した場合。

答えて

0

リストビュー/リサイクルビューでデータセットを反映しないリスト(たとえば項目の繰り返しなど)が発生した場合は、以前に使用されたビューを使用していて、バウンド、または単にバインド

あなたはそれが間違って取得しているところ、私が見

中に間違った位置を使用して:

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は、このような位置を保存しないでください。

が起こっていただきました:ビューのこのインスタンスは、時々(何度も)(ビュー== null)の場合はfalseになりますと、これはTagプロパティを意味はを更新されないことを意味し、リストビューで再利用されています行6(またはリサイクルされたビューを使用するその他の呼び出し)の場合は、実際にはダーティ値を使用しています。

あなたはそれを使用する必要があります呼び出して位置としてTagプロパティを使用しようとしていますが、この方法での位置へのアクセス権を持っているので、ビューが

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

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

をリサイクルした場合は、このタグを忘れてはすでに汚れている

直接

Javaコードのオタクからこのguideをご覧ください。古いJavaのViewHolder/ListViewパターンの優れた実装を見ることができます。


希望、これはあなたが何が悪かったのかを理解するように、更新の答えをチェックし@Harsh

+0

を助け、実際に私は直接、位置の値を使用してみましたが、それでも私は、)私の問題についてのあなたの助けと理解のため – HenriqueMS

+0

感謝を同じ問題が発生しています。 –

+0

@HarshBakshiあなたは歓迎です、私はあなたが変数 "pos"を使用していると信じています。汚れた値を取得しています。変数の宣言を削除し、どこにでも "pos" "? 申し訳ありませんが、これは本当に1つを忘れるのは簡単です、それは悪いのために十分です。 – HenriqueMS

関連する問題