Search code examples
androidxamarin.androidbundleparcelable

xamarin android bundle put parcelable array


I need to save array of object in bundle, here is what I did :

create class what is implementing IParcable interface:

 public class SimpleSelectorItem : Java.Lang.Object, Android.OS.IParcelable
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool Selected { get; set; }

        IntPtr IJavaObject.Handle { get { return IntPtr.Zero; } }

        public int DescribeContents()
        {
            return 0;
        }

        public SimpleSelectorItem()
        {

        }

        public SimpleSelectorItem(int id, string name)
        {
            Id = id;
            Name = name;
        }

        public SimpleSelectorItem(Parcel parcel)
        {
            Id = parcel.ReadInt();
            Name = parcel.ReadString();
        }

        public void WriteToParcel(Parcel dest, [GeneratedEnum] ParcelableWriteFlags flags)
        {
            dest.WriteInt(Id);
            dest.WriteString(Name);
        }

        static readonly GenericParcelableCreator<SimpleSelectorItem> _creator
       = new GenericParcelableCreator<SimpleSelectorItem>((parcel) => new SimpleSelectorItem(parcel));

        [ExportField("CREATOR")]
        public static GenericParcelableCreator<SimpleSelectorItem> GetCreator()
        {
            return _creator;
        }
    }

when I'm creating instance of my fragment , trying to set array of SimpleSelectorItem in bundle :

     var items = _viewModel.GetEmployees().Select(l => new SimpleSelectorItem(l.Id, l.LegalName)).ToArray();
      ....
     args.PutParcelableArray(ITEMS, items);

But when I'm getting back this array, it is array of nulls..

 var items = Arguments.GetParcelableArray(ITEMS); 

Here is demo application , it throw exception while i'm trying to cast items: https://github.com/Nininea/XamarinAndroidPutParcelableArray


Solution

  • But when I'm getting back this array, it is array of nulls..

    I've tested the project.The data are passed correctly, but the cast failed.

    To resolve the problem, you need to cast the array differently:

    In SetData Method:

    private void SetData(View rootView)
        {
           ...
           //use the following line to retrieve and cast the items to SimpleSelectorItem[]
            var items = Arguments.GetParcelableArray(ITEMS).Cast<SimpleSelectorItem>().ToList();
    
            _lvSelector = (ListView)rootView.FindViewById(Resource.Id.lvSelector);
            //pass the items to your adapter.
            SimpleSelectorListAdapter adapter = new SimpleSelectorListAdapter(Activity, items);
            _lvSelector.Adapter = adapter;
        }