如何使用xamarin将一个活动中的List从一个活动传递到另一个活动

时间:2014-11-13 06:19:06

标签: android xamarin

我是Xamarin的新手。我需要通过intent将数据列表从一个活动传递到另一个活动。并在另一个活动屏幕中获取这些数据并处理这些数据。请提出解决方案。

提前致谢

3 个答案:

答案 0 :(得分:1)

我对此有所不同。我创建了一个继承自Java.Lang.Object, ISerializable的基类,以便我可以使用Bundle.PutSerializable(string key, ISerializable value)在活动之间传递我的对象。

[Flags]
public enum ObjectState
{
    Normal = 0,
    New = 1,
    Modified = 2,
    Removed = 4
}

public abstract class ObjectBase : Java.Lang.Object, ISerializable
{
    public Guid Id { get; set; }

    public ObjectState State { get; set; }

    protected ObjectBase(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
    {
    }

    protected ObjectBase()
    {
    }

    [Export("readObject", Throws = new[] { typeof(IOException), typeof(Java.Lang.ClassNotFoundException) })]
    private void ReadObject(ObjectInputStream stream)
    {
        this.Deserialize(stream);
    }

    [Export("writeObject", Throws = new[] { typeof(IOException), typeof(Java.Lang.ClassNotFoundException) })]
    private void WriteObject(ObjectOutputStream stream)
    {
        this.Serialize(stream);
    }

    protected virtual void Deserialize(ObjectInputStream stream)
    {
        this.Id = Guid.Parse(stream.ReadUTF());
        this.State = (ObjectState)stream.ReadInt();
    }

    protected virtual void Serialize(ObjectOutputStream stream)
    {
        stream.WriteUTF(this.Id.ToString());
        stream.WriteInt((int)this.State);
    }
}

public class Person : ObjectBase
{
    public string Name { get; set; }

    public int Age { get; set; }

    public bool IsMarried { get; set; }

    public DateTime? Anniversary { get; set; }

    protected override void Deserialize(ObjectInputStream stream)
    {
        base.Deserialize(stream);

        if (stream.ReadBoolean())
            this.Name = stream.ReadUTF();

        this.Age = stream.ReadInt();

        this.IsMarried = stream.ReadBoolean();

        if (stream.ReadBoolean())
            this.Anniversary = DateTime.Parse(stream.ReadUTF());
    }

    protected override void Serialize(ObjectOutputStream stream)
    {
        base.Serialize(stream);

        stream.WriteBoolean(this.Name != null);

        if (this.Name != null)
            stream.WriteUTF(this.Name);

        stream.WriteInt(this.Age);

        stream.WriteBoolean(this.IsMarried);

        stream.WriteBoolean(this.Anniversary != null);

        if (this.Anniversary != null)
            stream.WriteUTF(this.Anniversary.Value.ToString(CultureInfo.InvariantCulture));
    }
}

然后我可以通过执行以下操作将Person对象列表传递给新的Activity:

List<Person> persons = new List<Person>();
var intent = new Intent(this, typeof(MyActivity));
var bundle = new Bundle();
for (int i = 0; i < persons.Count; i++)
{
    var p = persons[i];
    bundle.PutSerializable("Person" + i, p);
}
intent.PutExtras(bundle);
this.StartActivity(intent);

然后接受这样的对象:

protected override void OnCreate(Bundle bundle)
{
    List<Person> persons = new List<Person>();
    int i = 0;
    while (bundle.ContainsKey("Person" + i))
    {
        var p = (Person) bundle.GetSerializable("Person" + i);
        persons.Add(p);
        i++;
    }
    base.OnCreate(bundle);
}

答案 1 :(得分:0)

要将内容列表从一个活动传递到其他活动,您可以使用parcelable类。它是一种捆绑类型,我们可以将任何类型的内容从一个活动传递到其他活动。唯一的问题是您只需根据需要自定义parcelable类。

请访问此Link或下载此示例项目,以便了解有关将内容列表从一个活动传递到其他活动的详情。

希望这能解决您的问题。

答案 2 :(得分:0)

使用泛型类型的IList将数据从一个活动传递到另一个活动所需的数据。

        IList<String> Mon_year = new List<String>();

然后在意图

中传递此List
        i.PutStringArrayListExtra("month_year",Mon_year);

在另一项活动中(您想要获取已发送的数据)

        IList<String> Mon_year = Intent.GetStringArrayListExtra("month_year") ;// here u get the Ilist of String data...