Ah, I found out that you have to instantiate a new adapter and set it to ListAdapter before NotifyDataSetChanged does anything. So now my RunOnUiThread should look like:
RunOnUiThread(() => { ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.list_item, list); ((BaseAdapter)this.ListAdapter).NotifyDataSetChanged(); }); This works and updates the ListView with the new values. Excellent, thank you Greg. On Thu, Sep 1, 2011 at 2:36 PM, Tomasz Cielecki <tom...@ostebaronen.dk> wrote: > Ok, so I tried to cast the adapter, but nothing happens. Here is my code: > > using System; > using System.Collections.Generic; > using System.Linq; > using System.Text; > > using Android.App; > using Android.Content; > using Android.OS; > using Android.Runtime; > using Android.Views; > using Android.Widget; > > using LoadSiteList; > using Android.Util; > using System.Threading; > > namespace MonoActivityFun > { > [Activity(Label = "My Activity")] > public class MyListActivity : ListActivity > { > List<String> list; > private ProgressDialog d; > string tag = "TEST"; > protected override void OnCreate(Bundle bundle) > { > base.OnCreate(bundle); > list = new List<String>(); > MyModel m = new MyModel(); > > m.Items.CollectionChanged += new > System.Collections.Specialized.NotifyCollectionChangedEventHandler(Items_CollectionChanged); > > ThreadPool.QueueUserWorkItem(o => m.Load()); > > if (list.Count == 0) > { > list.Add("No data present"); > } > ListAdapter = new ArrayAdapter<string>(this, > Resource.Layout.list_item, list); > ListView.TextFilterEnabled = true; > > SetContentView(ListView); > > ListView.ItemClick += delegate(object sender, ItemEventArgs args) > { > // When clicked, show a toast with the TextView text > Toast.MakeText(Application, > ((TextView)args.View).Text, ToastLength.Short).Show(); > }; > } > > void Items_CollectionChanged(object sender, > System.Collections.Specialized.NotifyCollectionChangedEventArgs e) > { > if (e.NewItems != null) > { > Log.Warn(tag, "MyListActivity: e.NewItems count " + > e.NewItems.Count.ToString()); > foreach (object s in e.NewItems) > { > Log.Warn(tag, "MyListActivity: > Items_CollectionChanged: " + s.ToString()); > list.Add(s.ToString()); > if (list.Contains("No data present")) { > list.Remove("No data present"); > } > } > RunOnUiThread(() => > { > ((BaseAdapter)this.ListAdapter).NotifyDataSetChanged(); > }); > } > } > } > } > > I know that this code enters Items_Collection changed as i can easily > output the things being added to list. > > I have tried running it on the UI thread and not, both fail to update > the ListView with new data. > > On Thu, Sep 1, 2011 at 2:07 PM, Greg Shackles <gshack...@gmail.com> wrote: >> Adapters generally all inherit from BaseAdapter so they'll have access to >> the method (this is exactly the same as the Java side, for what it's worth). >> I don't know what your code looks like, but my guess is that you're doing >> something along the lines of: >> var view = FindViewById<ListView>(Resource.Id.List); >> view.Adapter = new ArrayAdapter(.....); // or some other kind of adapter >> view.Adapter.NotifyDataSetChanged(); >> The last line won't compile since the Adapter property on ListView is of >> type IListAdapter >> (http://docs.mono-android.net/index.aspx?link=P%3aAndroid.Widget.ListView.Adapter). >> You can either cast the adapter when you want to access those methods: >> ((ArrayAdapter)view.Adapter).NotifyDataSetChanged(); >> Or you can keep a reference to the object with its type when you create it >> (this is the approach I'd prefer): >> var adapter = new ArrayAdapter(......); >> view.Adapter = adapter; >> adapter.NotifyDataSetChanged(); >> >> On Thu, Sep 1, 2011 at 7:54 AM, Tomasz Cielecki <tom...@ostebaronen.dk> >> wrote: >>> >>> So that means I have to cast the ListAdapter to BaseAdapter to invoke >>> that method? >>> >>> On Thu, Sep 1, 2011 at 1:35 PM, Greg Shackles <gshack...@gmail.com> wrote: >>> > That method is available as part of Mono for >>> > >>> > Android: http://docs.mono-android.net/index.aspx?link=M%3aAndroid.Widget.BaseAdapter.NotifyDataSetChanged >>> > >>> > On Thu, Sep 1, 2011 at 6:48 AM, Tomasz Cielecki <tom...@ostebaronen.dk> >>> > wrote: >>> >> >>> >> Hello there, >>> >> >>> >> I have a asynchronous method loading data in the background, when that >>> >> is finished I want to update my ListView with the data this method has >>> >> loaded into an ObservableCollection. It seems that normally when >>> >> coding java you can invoke the method notifyDataSetChanged on the >>> >> ListAdapter, but this method seems to be missing in MonoDroid. >>> >> >>> >> So my question is, how do I update my ListView with this new data? >>> >> >>> >> -- >>> >> Med Venlig Hilsen / With Best Regards >>> >> Tomasz Cielecki >>> >> http://ostebaronen.dk >>> >> _______________________________________________ >>> >> Monodroid mailing list >>> >> Monodroid@lists.ximian.com >>> >> >>> >> UNSUBSCRIBE INFORMATION: >>> >> http://lists.ximian.com/mailman/listinfo/monodroid >>> > >>> > >>> > _______________________________________________ >>> > Monodroid mailing list >>> > Monodroid@lists.ximian.com >>> > >>> > UNSUBSCRIBE INFORMATION: >>> > http://lists.ximian.com/mailman/listinfo/monodroid >>> > >>> > >>> >>> >>> >>> -- >>> Med Venlig Hilsen / With Best Regards >>> Tomasz Cielecki >>> http://ostebaronen.dk >>> _______________________________________________ >>> Monodroid mailing list >>> Monodroid@lists.ximian.com >>> >>> UNSUBSCRIBE INFORMATION: >>> http://lists.ximian.com/mailman/listinfo/monodroid >> >> >> _______________________________________________ >> Monodroid mailing list >> Monodroid@lists.ximian.com >> >> UNSUBSCRIBE INFORMATION: >> http://lists.ximian.com/mailman/listinfo/monodroid >> >> > > > > -- > Med Venlig Hilsen / With Best Regards > Tomasz Cielecki > http://ostebaronen.dk > -- Med Venlig Hilsen / With Best Regards Tomasz Cielecki http://ostebaronen.dk _______________________________________________ Monodroid mailing list Monodroid@lists.ximian.com UNSUBSCRIBE INFORMATION: http://lists.ximian.com/mailman/listinfo/monodroid