On Oct 15, 2011, at 10:44 AM, Stuart Johnson wrote:
> I have a List<> with an ArrayAdapter that shows the contents of that list.
>
> If I make a change to one of those items in the List<>, and do
> NotifyDataSetChanged() in the UI thread, I can see those changes. But
> if I .Add to the List<>, I cant see the new items.
We expose standard .NET interface collection types instead of Java interface
collection types, e.g. IList<T> instead of java.util.List<E>, to facilitate
greater code sharing. This is generally good. :-)
However, the Java code still wants/needs/requires a java.util.List<E>, so there
are two ways we could have gone with this:
1) Write a java.util.List<E> implementation which wraps an IList<T>, delegating
all List<E> method calls. This means that every collection traversal from Java
would require several Java->managed transitions.
2) Copy the IList<T> into an internal java.util.ArrayList<E> wrapper on
"input", and let Java manipulate the Java collection. This would allow ~direct
Java access to the collection, though invocation of individual elements would
require a Java->managed transition.
For reasons I'm not entirely sure of (probably performance), we went with (2),
which is exactly what you're seeing -- when you add an element to your List<T>,
Android doesn't see it. Android doesn't see it because it's not present in the
Java-side collection, because a new collection was created and copied when
creating the original ArrayAdapter instance.
http://docs.xamarin.com/android/advanced_topics/api_design#Collections
The workaround is to use an Android.Runtime.JavaList<T>, which wraps a
Java-side java.util.ArrayList, and thus adding an element to a JavaList<T> will
make it immediately visible to Java code.
- Jon
_______________________________________________
Monodroid mailing list
[email protected]
UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid