Я попытался сделать это, очистив все данные перед этим и уведомив, что теперь есть данные, но они, похоже, не работают.
Из общего кода, не видя ясного метода, Вы можете добавить reports.Clear()
, чтобы проверить, работает ли он.
public void updateReportsList(List<MobileReport> newlist)
{
reports.Clear();
reports.AddRange(newlist);
this.NotifyDataSetChanged();
}
Если не работает, необходимо проверить, добавлен ли newlist
правильный формат данных.
===== =================== Обновление =============================
В методе OnCreate
, где _reportsHubConnector.ReportsRecieved
метод обновления вызова изменяется следующим образом:
_reportsHubConnector.ReportsRecieved += (tmpReports) =>
{
adapter.updateReportsList(tmpReports);
};
Измените аргумент reports
на tmpReports
, чтобы избежать смешивания с исходными данными reports
.
Следовательно, существует другой распространенный способ обновления данных адаптера:
_reportsHubConnector.ReportsRecieved += (reports) =>
{
List<IMobileReport> tmp = new List<IMobileReport>();
tmp = reports ; // use a tmp list data for updating , not using original list data
adapter.updateReportsList(tmp);
};
======================= ==== Обновление =====================================
Из моего примера проекта я нахожу Интересное явление и, возможно, проблема.
Здесь я поделюсь своим пользовательским адаптером HomeScreenAdapter :
public class HomeScreenAdapter : BaseAdapter<TableItem> {
List<TableItem> items;
Activity context;
public HomeScreenAdapter(Activity context, List<TableItem> items)
: base()
{
this.context = context;
this.items = new List<TableItem>();
this.items.AddRange(items);
//this.items = items;
}
public override long GetItemId(int position)
{
return position;
}
public override TableItem this[int position]
{
get { return items[position]; }
}
public override int Count
{
get { return items.Count; }
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var item = items[position];
View view = convertView;
if (view == null) // no view to re-use, create new
view = context.LayoutInflater.Inflate(Resource.Layout.CustomView, null);
view.FindViewById<TextView>(Resource.Id.Text1).Text = item.Heading;
view.FindViewById<TextView>(Resource.Id.Text2).Text = item.SubHeading+" items";
view.FindViewById<ImageView>(Resource.Id.Image).SetImageResource(item.ImageResourceId);
return view;
}
public void UpdateListView(List<TableItem> newTableItem)
{
items.Clear();
items.AddRange(newTableItem);
NotifyDataSetChanged();
}
}
Вы увидите в Constructor
из HomeScree nAdapter , я прокомментировал эту строку кода this.items = items;
. Причина, по которой он будет работать:
Однако , если я использую this.items = items;
вместо this.items.AddRange(items);
, он будет Обновление ничего даже не может ничего показать в ListView
.
public HomeScreenAdapter(Activity context, List<TableItem> items)
: base()
{
this.context = context;
this.items = new List<TableItem>();
//this.items.AddRange(items);
this.items = items;
}
Эффект:
Возможное причина :
Если здесь используется знак равенства, адрес указателя элементов изменится. Когда данные обновляются, они не могут указывать на исходный источник данных, поэтому обновление не может быть успешным.
Поэтому , здесь Constructor
вашего кода можно изменить следующим образом, чтобы проверить, как это происходит. это работает:
public ReportsListViewAdapter(Context context, IEnumerable<IMobileReport> reports)
{
//this.reports = reports.OrderBy(report => report.StudyDate).ToList();
this.reports = new List<IMobileReport>();
this.reports.AddRange(reports.OrderBy(report => report.StudyDate).ToList());
this.context = context;
Filter = new ReportsFilter(this);
}
Связано : Вот примерная ссылка проекта .