[mono-android] BaseAdapter and JavaList problem
John Rayner
anyerr at gmail.com
Mon Mar 21 07:34:52 EDT 2011
Curiously it works absolutely fine if I use a regular
System.Collections.Generic.List<T> instead of an
Android.Runtime.JavaList<T>. I thought (based on some recent email threads)
that it was more appropriate to use JavaList<T> for this sort of thing. Can
anyone pls clarify?
Cheers,
John
On Mon, Mar 21, 2011 at 10:03 AM, John Rayner <anyerr at gmail.com> wrote:
> Hiya,
>
> I'm new to Android dev, so I'm prob doing something stupid, but I'm having
> some difficulty writing a custom adapter for a ListView. I use an
> Android.Runtime.JavaList collection to hold my bound items, but whenever I
> try to retrieve any values from it I always get null values even though I've
> added valid objects. As a result, my GetView method is not correctly
> populating my list view. Here is my adapter:
>
> public class SimpleMessageAdapter : BaseAdapter
> {
> private readonly Context _context;
> private readonly IList<SimpleMessage> _list;
>
> public SimpleMessageAdapter(Context context, IList<SimpleMessage>
> list)
> {
> _context = context;
> _list = list;
> }
>
> public override Object GetItem(int position)
> {
> return _list[position];
> }
>
> public override long GetItemId(int position)
> {
> return position;
> }
>
> public override View GetView(int position, View convertView,
> ViewGroup parent)
> {
> TextView tv = convertView as TextView ?? new
> TextView(_context);
> tv.Text = _list[position] != null ? _list[position].Text :
> "(error)"; // _list[position] is *always* null here
> return tv;
> }
>
> public override int Count
> {
> get { return _list.Count; }
> }
> }
>
> And here is my Activity, for reference:
>
> [Activity(Label = "AndroidClient", MainLauncher = true)]
> public class MessagingActivity : Activity
> {
> private MessageChannel _channel;
> private IList<SimpleMessage> messageList = new
> JavaList<SimpleMessage>();
> private SimpleMessageAdapter _adapter;
>
> protected override void OnCreate(Bundle bundle)
> {
> base.OnCreate(bundle);
>
> // Set our view from the "main" layout resource
> SetContentView(Resource.Layout.Main);
> var messages = FindViewById<ListView>(Resource.Id.messages);
> _adapter = new SimpleMessageAdapter(this, messageList);
> messages.Adapter = _adapter;
>
> _channel = new MessageChannel();
> _channel.ReceivedMessages
> .OfType<SimpleMessage>()
> .Subscribe(msg => AddMessage(msg));
>
> // Get our button from the layout resource,
> // and attach an event to it
> Button button = FindViewById<Button>(Resource.Id.send_button);
> button.Click += delegate {
> SendMessage(FindViewById<EditText>(Resource.Id.new_message).Text.ToString());
> };
>
> Button button2 = FindViewById<Button>(Resource.Id.poll_button);
> button2.Click += delegate { _channel.ForcePoll(); };
> }
>
> private void AddMessage(SimpleMessage msg)
> {
> RunOnUiThread(() =>
> {
> messageList.Add(msg); // This is
> where I add my objects into the list
> _adapter.NotifyDataSetChanged();
> });
> }
>
> private void SendMessage(string message)
> {
> _channel.Send(new SimpleMessage
> {
> Text = message
> });
> }
> }
>
> All help appreciated.
>
> Cheers,
> John
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/mailman/private/monodroid/attachments/20110321/41afdddd/attachment-0001.html
More information about the Monodroid
mailing list