Monodroid ListView更新问题
本文关键字:新问题 更新 ListView Monodroid | 更新日期: 2023-09-27 18:23:57
刚开始使用Monodroid,我目前正在开发ListView。我在ArrayAdapter中添加了一个List,我可以正确地看到我的前两个项目。但是,当我向列表中添加第三个元素时,listview不会更新。尽管我调用了notifyDataSetChanged()。
private ArrayAdapter<string> la;
private ListView list;
private List<String> dayData = new List<String>();
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.SetContentView(Resource.Layout.TestLayout);
dayData.Add(" Test");
dayData.Add(" Test2"); // Theese two elements shows up fine
list = this.FindViewById<ListView>(Resource.Id.menuList);
la = new ArrayAdapter<string>(this, Resource.Layout.list_item, dayData);
list.Adapter = la;
list.TextFilterEnabled = true;
dayData.Add(" Test3"); // This one is not shown
la.NotifyDataSetChanged();
} // OnCreate
我遗漏了什么线索吗?
我在另一个论坛上找到了一个解决方案。不知怎的,ArrayAdapter在使用list时不会注意到列表的更改。相反,使用Android.Runtime.JavaList.
您可以在此处找到讨论:http://mono-for-android.1047100.n5.nabble.com/Update-ListView-when-dataset-changes-td4757874.html
工作起来很有魅力!:)
我不完全确定,但我认为项目已复制到ArrayAdapter
中,因此您需要做的是:
la.Add(" Test3");
如果你想保持列表不变,你也必须将其添加到list
中。
尝试此Add-la.notifyDataSetInvalidated();在la.NotifyDataSetChanged()之后;
我不确定这对任何人都有多大帮助,但在我的例子中似乎效果很好。
我有一个ViewModel类,它将我更新的所有数据保存在应用程序中,并在集合更改时触发"更新集合"操作。
// All within ViewModel.cs
private Action SearchResultsUpdated;
private List<SearchResult> m_oSearchResults;
Public List<SearchResult> SearchResults
{
get
{
if (m_oSearchResults == null)
m_oSearchResults = new List<SearchResult> ();
return m_oSearchResults;
}
set
{
if (value != m_oSearchResults)
{
m_oSearchResults = value;
//
// Fire update event
if (SearchResultsUpdated != null)
SearchResultsUpdated ();
}
}
}
然后,我在适配器类中为该事件添加一个处理程序。
// All within SearchResultsAdapter.cs
public class SearchResultsAdapter : BaseAdapter<SearchResult>
{
.
.
// Constructor
public SearchResultsAdapter (Activity oContext)
: base ()
{
// Add handler for list refresh
ViewModel.SearchResultsUpdated += NotifyDataSetChanged;
//
m_oContext = oContext;
}
}
在适配器中,我使用集合ViewModel.SearchResults作为列表视图的数据上下文。希望这能有所帮助,而且足够彻底,让每个人都能理解。
更新ListView
private ListView lvAnuncios = null;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.lvAnuncios = this.FindViewById<ListView>(Resource.Id.MisAnuncios_lvAnuncios);
}
private void ReloadListView()
{
if (this.lvAnuncios.Adapter != null)
{
this.lvAnuncios.Adapter.Dispose();
this.lvAnuncios.Adapter = null;
}
//Class that inherits de ArrayAdapter
this.lvAnuncios.Adapter = new adAnuncio(this, Resource.Layout.FilaListViewAnuncio, csVariable.objUsr.lstAnuncios);
}