2016-08-30 4 views
0

私はXamarin-Android用に作成したカスタムリストビューを持っています。従業員シフトのリストからデータを取り出して行に変換します。一部のデータは間違ってすぐに報告されています(シフトしていないことを示しています)。また、データの周りをスクロールすることが定期的に変化しています。カスタムListViewが画面からスクロールして戻ったときにデータを変更しています

本質的に、アダプタにはListの従業員のリストを渡します。各リストには、開始時刻と終了時刻を保持するList型があります。アダプターは各シフトをループし、スイッチを使用して、いつでも正しいTextViewsにルーティングし、データをペーストします。何らかの理由でデータが一部の行で正しく表示されない場合がありますが、それ以外の場合は問題ありません。行をクリックすると(データを編集するための別のビューが表示されます)、データは想定されているとおりに正しく表示されます。私はステップアップして何が起こっているのか理解しようとしましたが、ステッピングすると行が正しく返されていることがわかります。

データが正しく表示されない状態で、スクロールアップまたはスクロールすると、行が画面から消えるときに、別のデータで戻ってくることがあります。ここで

は、アダプタのコードです:

using System; 
using System.Collections.Generic; 
using Android.Content; 
using Android.Views; 
using Android.Widget; 

namespace MaydSchedulerApp 
{ 
    class ScheduleAdapter : BaseAdapter<EmployeeScheduleWrapper> 
    { 
     private List<EmployeeScheduleWrapper> mItems; 
     private Context mContext; 
     private bool sun = false, mon = false, tue = false, wed = false, thu = false, fri = false, sat = false; 

     public ScheduleAdapter(Context context, List<EmployeeScheduleWrapper> items) 
     { 
      mItems = items; 
      mContext = context; 
     } 

     public override int Count 
     { 
      get 
      { 
       return mItems.Count; 
      } 
     } 

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

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

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

      if (row == null) 
      { 
       row = LayoutInflater.From(mContext).Inflate(Resource.Layout.ScheduleListView, null, false); 
      } 

      TextView txtName = row.FindViewById<TextView>(Resource.Id.txtScheduleName); 
      txtName.Text = mItems[position].lName + ", " + mItems[position].fName; 

      TextView txtPosition = row.FindViewById<TextView>(Resource.Id.txtSchedulePosition); 
      txtPosition.Text = CoreSystem.GetPositionName(mItems[position].position); 

      TextView txtSunday = row.FindViewById<TextView>(Resource.Id.txtSun); 
      TextView txtMonday = row.FindViewById<TextView>(Resource.Id.txtMon); 
      TextView txtTuesday = row.FindViewById<TextView>(Resource.Id.txtTue); 
      TextView txtWednesday = row.FindViewById<TextView>(Resource.Id.txtWed); 
      TextView txtThursday = row.FindViewById<TextView>(Resource.Id.txtThu); 
      TextView txtFriday = row.FindViewById<TextView>(Resource.Id.txtFri); 
      TextView txtSaturday = row.FindViewById<TextView>(Resource.Id.txtSat); 
      for (int i = 0; i < mItems[position].shiftList.Count; i++) 
      { 
       switch (mItems[position].shiftList[i].date) 
       { 
        case DayOfWeek.Sunday: 
         txtSunday.Text = mItems[position].shiftList[i].startShift.ToString() + "00 - " + mItems[position].shiftList[i].endShift.ToString() + "00"; 
         sun = true; 
         break; 
        case DayOfWeek.Monday: 
         txtMonday.Text = mItems[position].shiftList[i].startShift.ToString() + "00 - " + mItems[position].shiftList[i].endShift.ToString() + "00"; 
         mon = true; 
         break; 
        case DayOfWeek.Tuesday: 
         txtTuesday.Text = mItems[position].shiftList[i].startShift.ToString() + "00 - " + mItems[position].shiftList[i].endShift.ToString() + "00"; 
         tue = true; 
         break; 
        case DayOfWeek.Wednesday: 
         txtWednesday.Text = mItems[position].shiftList[i].startShift.ToString() + "00 - " + mItems[position].shiftList[i].endShift.ToString() + "00"; 
         wed = true; 
         break; 
        case DayOfWeek.Thursday: 
         txtThursday.Text = mItems[position].shiftList[i].startShift.ToString() + "00 - " + mItems[position].shiftList[i].endShift.ToString() + "00"; 
         thu = true; 
         break; 
        case DayOfWeek.Friday: 
         txtFriday.Text = mItems[position].shiftList[i].startShift.ToString() + "00 - " + mItems[position].shiftList[i].endShift.ToString() + "00"; 
         fri = true; 
         break; 
        case DayOfWeek.Saturday: 
         txtSaturday.Text = mItems[position].shiftList[i].startShift.ToString() + "00 - " + mItems[position].shiftList[i].endShift.ToString() + "00"; 
         sat = true; 
         break; 
       } 
      } 
      if (!sun) 
       txtSunday.Text = "Off"; 
      if (!mon) 
       txtMonday.Text = "Off"; 
      if (!tue) 
       txtTuesday.Text = "Off"; 
      if (!wed) 
       txtWednesday.Text = "Off"; 
      if (!thu) 
       txtThursday.Text = "Off"; 
      if (!fri) 
       txtFriday.Text = "Off"; 
      if (!sat) 
       txtSaturday.Text = "Off"; 
      return row; 
     } 
    } 
} 

そして、ここでは、あなたが空のデータにビューをリセットする必要がEmployeeScheduleWrapper

using System; 
using System.Collections; 
using System.Collections.Generic; 

namespace MaydSchedulerApp 
{ 
    public class EmployeeScheduleWrapper 
    { 
     public string lName, fName; 
     public int employee; 
     public int position; 
     public int hourTarget; 
     public int skill;//This is to minimize callbacks to the main emp later 
     public int scheduledHours; 
     //The availability is copied onto this so that it can be modified without effecting the set availability in the employee type 
     public Availability availability = new Availability(); 
     public bool availabilityModified = false; 
     public List<Shift> shiftList = new List<Shift>(); 

     public EmployeeScheduleWrapper() { } 

     public EmployeeScheduleWrapper(Employee emp) 
     { 
      lName = emp.empLastName; 
      fName = emp.empFirstName; 
      employee = emp.empID; 
      position = emp.position; 
      skill = emp.skillLevel; 
      hourTarget = emp.hourTarget; 
      scheduledHours = 0; 
      //availability = emp.availability;//Dont init this unless its changed and needs to be saved 
      availabilityModified = false; 
     } 

     public void SetTempAvailability(Availability avail)//TODO add check for when avail last changed to warn user if availability is no longer useful 
     { 
      availability = avail; 
      availabilityModified = true; 
     } 

     public void PermanentAvailabilityChange(Availability avail) 
     { 
      availability = avail; 
      availabilityModified = false;//since were using the permanent change 
      EmployeeStorage.GetEmployee(employee).availability = avail; 
     } 

     public Availability GetEntireAvail() 
     { 
      if (availabilityModified) 
       return availability; 
      else 
      {//This fixes the direct memory interaction when modifying temp availability 
       availability = new Availability(EmployeeStorage.GetEmployee(employee).availability); 
       return availability; 
      } 
     } 

     public bool GetAvailability(int day) 
     { 
      if (availabilityModified) 
      { 
       switch (day) 
       { 
        case 0: 
         return availability.sunday.available; 
        case 1: 
         return availability.monday.available; 
        case 2: 
         return availability.tuesday.available; 
        case 3: 
         return availability.wednesday.available; 
        case 4: 
         return availability.thursday.available; 
        case 5: 
         return availability.friday.available; 
        case 6: 
         return availability.saturday.available; 
        default: 
         Console.WriteLine("Invalid case chosen! :: EmployeeManagement/Employee.cs :: GetAvailability(int day): Invalid Value for Day Thrown! :: Returning false!"); 
         break; 
       } 
       return false; 
      } 
      else 
      { 
       return EmployeeStorage.GetEmployee(employee).GetAvailability(day); 
      } 
     } 
    } 
} 

答えて

1

ためのコードです。

つまり、リストビューは変換ビューを使用してメモリを最適化します。その間、リストビューは以前のデータを含む以前に使用された変換ビューを返します。 、スイッチケースの文にした

+0

 txtSunday.Text = ""; txtMonday.Text = ""; txtTuesday.Text = ""; txtWednesday.Text = ""; txtThursday.Text = ""; txtFriday.Text = ""; txtSaturday.Text = ""; 

をそんなにありがとう:だから、あるgetViewメソッド()

にデータをリセットする必要があります。私はグーグルで検索するときにできる限り多くの方法があると言いましたが、それを修正する方法は全く説明されていませんでした。 – Taylor

関連する問題