2017-11-11 3 views
0

ListView를 에 구현했습니다. Xamarin.Android 행 목록에 몇 개의 단추가 있지만 버튼을 클릭하면 두 번 이상 표시됩니다. 나는이 방법을 시도했지만 나를 위해 일하지 않았다. 나는 BaseAdapter<DA_ClassSectionAttendance>listview 행 항목이 두 번 이상 클릭되는 이유는 무엇입니까?

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

     // re-use an existing view, if one is available 
     // otherwise create a new one 
     if (view == null) 
      view = context.LayoutInflater.Inflate(Resource.Layout.AttendanceCreateRowList, parent, false); 
     var viewHolder = new ViewHolder(view); 

     DA_ClassSectionAttendance attendance = this[position]; 

     view.Tag = viewHolder; 
     viewHolder.ClassSection.Text = attendance.ClassName + " " + attendance.SectionName; 
     viewHolder.AttendanceEdit.Text = "Edit"; 
     viewHolder.AttendanceNew.Text = "New"; 
     viewHolder.AttendanceNew.Tag = viewHolder; 
     viewHolder.AttendanceNew.Click += (object sender, EventArgs ex) => 
     { 

      var obj = sender as Button; 
      var listView = parent as ListView; 
      //int objectPosition = (int)obj.Tag; 
      var itemPosition = listView.GetPositionForView(obj); 
      if (itemPosition != ListView.NoId) 
      { 

       CustomFragmentManager fragManager = new CustomFragmentManager(); 
       var fragment = new AttendanceCreateRecyclerFragment(); 
       Bundle args = new Bundle(); 
       var jsonData = JsonConvert.SerializeObject(this[itemPosition]).ToString(); 
       args.PutString(AttendanceCreateRecyclerFragment.DATA_RECEIVE, jsonData); 
       fragment.Arguments = args; 

       fragManager.ReplaceFragment(context, fragment); 

      } 

     }; 

     return view; 
    } 

에서이 방법을 내가 클릭 이벤트를 구현하기보다는 청취자를 클릭하고 싶은

private class ViewHolder : Java.Lang.Object 
    { 
     public ViewHolder(View view) 
     { 
      ClassSection = view.FindViewById<TextView>(Resource.Id.class_section); 
      AttendanceNew = view.FindViewById<Button>(Resource.Id.new_attendance); 
      AttendanceEdit = view.FindViewById<Button>(Resource.Id.edit_attendance); 
     } 

     public TextView ClassSection { get; set; } 
     public Button AttendanceNew { get; set; } 
     public Button AttendanceEdit { get; set; } 
    } 

을 다음과 같이 뷰 홀더입니다. 설명과 함께 샘플 코드를 많이 주시면 감사하겠습니다. 고맙습니다.

+0

RecylerView는 ListView보다 효율적입니다. RecylerView를 사용해야합니다. '듣기보다는 클릭 이벤트를 구현하고 싶습니다. '- 차이점은 무엇입니까? 클릭 수신기를보기로 설정하면보기를 클릭 할 때 클릭 이벤트를 차단할 수 있습니다. 클릭 이벤트를 차단하려면 클릭 리스너를 설정해야합니다. –

+0

recylerView를 사용하면 많은 애니메이션과 부드러운 스크롤을 얻을 수 있습니다. –

답변

1

이유는 클릭 이벤트가 viewHolder.AttendanceNew.Click += (object sender, EventArgs ex) =>

로 만들고 뷰 홀더가 작동하지 않는 사용하는 방법을 여러 번 집착한다는 것입니다. 코드를 다음과 같이 변경하십시오.

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

    // re-use an existing view, if one is available 
    // otherwise create a new one 
    if (view == null) 
     view = context.LayoutInflater.Inflate(Resource.Layout.AttendanceCreateRowList, parent, false); 

    var viewHolder = view.Tag as ViewHolder; 

    if (viewHolder == null) 
    { 
     viewHolder = new ViewHolder(view); 
     viewHolder.AttendanceNew.Click += (object sender, EventArgs ex) => 
     { 
      var obj = sender as Button; 
      var listView = parent as ListView; 

      var itemPosition = listView.GetPositionForView(obj); 

      if (itemPosition != ListView.NoId) 
      { 
       CustomFragmentManager fragManager = new CustomFragmentManager(); 
       var fragment = new AttendanceCreateRecyclerFragment(); 
       Bundle args = new Bundle(); 
       var jsonData = JsonConvert.SerializeObject(this[itemPosition]).ToString(); 
      args.PutString(AttendanceCreateRecyclerFragment.DATA_RECEIVE, jsonData); 
       fragment.Arguments = args; 

       fragManager.ReplaceFragment(context, fragment); 
      } 
     }; 
    } 

    var attendance = this[position]; 

    viewHolder.ClassSection.Text = attendance.ClassName + " " + attendance.SectionName; 
    viewHolder.AttendanceEdit.Text = "Edit"; 
    viewHolder.AttendanceNew.Text = "New"; 

    view.Tag = viewHolder; 

    return view; 
}