刚开始使用Monodroid,我目前正在使用ListView。 我有一个List添加到ArrayAdapter,我可以正确看到我的前两个项目。但是,当我向列表中添加第三个元素时,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
我错过的任何线索?
答案 0 :(得分:2)
我自己在另一个论坛找到了解决方案。不知何故,ArrayAdapter在使用List时没有注意到列表更改。而是使用Android.Runtime.JavaList。
您可以在此处找到讨论:http://mono-for-android.1047100.n5.nabble.com/Update-ListView-when-dataset-changes-td4757874.html
像魅力一样! :)
答案 1 :(得分:0)
我不完全确定,但我认为这些项目已复制到ArrayAdapter
,因此您需要做的是:
la.Add(" Test3");
如果您希望保持列表相同,则必须将其添加到list
。
答案 2 :(得分:0)
试试这个添加la.notifyDataSetInvalidated();在la.NotifyDataSetChanged();
之后答案 3 :(得分:0)
我不确定这会对任何人有多大帮助,但它似乎在我的实例中运作良好。
我有一个ViewModel类,它保存我在App中更新的所有数据,并在集合发生变化时触发“Collection Updated”操作。
// 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作为列表视图的数据上下文。希望有帮助,并且足够让每个人都能理解。
答案 4 :(得分:0)
更新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);
}