Android 帮助传递ArrayList和parcelable活动

Android 帮助传递ArrayList和parcelable活动,android,android-activity,parcelable,Android,Android Activity,Parcelable,所以我昨天和昨晚大部分时间都在谷歌上搜索,似乎都不知道如何将arraylist传递给subactivity。有大量的示例和代码片段传递基本数据类型,但我有一个address类型的arraylist(下面是address.java) 我在stackoverflow和网络上找到了很多关于这个的东西,但是除了一个GeoPoint的例子之外,没有什么引起了人们的注意。再一次,在我看来,他们只是将GeoPoint对象展平为两个整数,然后将其传入。我不能这样做,因为我的address类可能会扩展为包含整数、

所以我昨天和昨晚大部分时间都在谷歌上搜索,似乎都不知道如何将arraylist传递给subactivity。有大量的示例和代码片段传递基本数据类型,但我有一个address类型的arraylist(下面是address.java)

我在stackoverflow和网络上找到了很多关于这个的东西,但是除了一个GeoPoint的例子之外,没有什么引起了人们的注意。再一次,在我看来,他们只是将GeoPoint对象展平为两个整数,然后将其传入。我不能这样做,因为我的address类可能会扩展为包含整数、浮点等。现在,为了简单起见,下面的测试应用程序只有两个字符串。我想如果我能让parcelalbe的东西用它工作,其他的就可以了

有人可以发布一个非原语对象的ArrayList的工作示例,或者在下面添加代码来实现这一点吗

更新:回复/编辑后,下面的代码正在运行。谢谢

/* helloParcel.java */        
       public class helloParcel extends Activity
{
    // holds objects of type 'address' == name and state
    private ArrayList <address> myList;

    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.main);

        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(ocl);

        myList = new ArrayList();
        address frank   = new address ("frank", "florida");
        address mary    = new address ("mary", "maryland");
        address monty   = new address ("monty", "montana");

        myList.add (frank);
        myList.add (mary);
        myList.add (monty);

        // add the myList ArrayList() the the extras for the intent

    }

    OnClickListener ocl = new OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
            // fill parceable and launch activity
            Intent intent = new Intent().setClass(getBaseContext (), subActivity.class);

            // for some reason, I remember a posting saying it's best to create a new
            // object to pass.  I have no idea why..
            ArrayList <address> addyExtras = new ArrayList <address>();

            for (int i = 0; i < myList.size(); i++)
                addyExtras.add (myList.get(i));

            intent.putParcelableArrayListExtra ("mylist", addyExtras);
            startActivity(intent);
        }
    };
} 



/* address.java */
  public class address implements Parcelable
{
    private String name;
    private String state;
    private static String TAG = "** address **";

    public address (String n, String s)
    {
        name = n;
        state = s;
        Log.d (TAG, "new address");
    }

    public address (Parcel in)
   {
    Log.d (TAG, "parcel in");
        name = in.readString ();
        state = in.readString ();
   }

    public String getState ()
    {
        Log.d (TAG, "getState()");
        return (state);
    }

    public String getName ()
    {
        Log.d (TAG, "getName()");
        return (name);
    }

    public static final Parcelable.Creator<address> CREATOR
    = new Parcelable.Creator<address>() 
   {
         public address createFromParcel(Parcel in) 
         {
            Log.d (TAG, "createFromParcel()");
             return new address(in);
         }

         public address[] newArray (int size) 
         {
            Log.d (TAG, "createFromParcel() newArray ");
             return new address[size];
         }
    };

    @Override
   public int describeContents ()
   {
        Log.d (TAG, "describe()");
       return 0;
   }

    @Override
   public void writeToParcel (Parcel dest, int flags)
   {
        Log.d (TAG, "writeToParcel");
       dest.writeString (name);
       dest.writeString (state);
   }

}


/* subActivity.java */
  public class subActivity extends Activity
{
    private final String TAG = "** subActivity **";
    private ArrayList <address> myList;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
       super.onCreate (savedInstanceState);
       Log.d (TAG, "onCreate() in subActivity");

       setContentView(R.layout.subactivity);
       TextView tv1 = (TextView) findViewById(R.id.tv_sub);

       myList = getIntent().getParcelableArrayListExtra ("mylist");
       Log.d (TAG, "got myList");

       for (int i = 0; i < myList.size (); i++)
       {
        address a = myList.get (i);
        Log.d (TAG, "state:" + a.getState ());
        tv1.setText (a.getName () + " is from " + a.getState ());
       }

    }

}
/*helloParcel.java*/
公共类helloParcel扩展活动
{
//保存“地址”==名称和状态类型的对象
私人ArrayList myList;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
按钮b1=(按钮)findViewById(R.id.button1);
b1.setOnClickListener(ocl);
myList=新的ArrayList();
地址弗兰克=新地址(“弗兰克”,“佛罗里达”);
地址玛丽=新地址(“玛丽”、“马里兰州”);
地址monty=新地址(“monty”、“montana”);
myList.add(frank);
myList.add(玛丽);
myList.add(monty);
//将myList ArrayList()添加到意图的附加项中
}
OnClickListener ocl=新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
//填充可分包并启动活动
Intent Intent=new Intent().setClass(getBaseContext(),subActivity.class);
//出于某种原因,我记得有一篇帖子说最好创建一个新的
//反对通过。我不知道为什么。。
ArrayList addyExtras=新的ArrayList();
对于(int i=0;i
您可以通过putExtra传递可序列化对象。ArrayList实现了可序列化。

我可以在这里看到一些问题:

  • 为什么要使用addressParcelable?为什么不让地址实现可包裹,然后使用:

    intent.putParcelableArrayListExtra( "addresses", addyExtras );
    
  • 您的可包裹对象必须包含静态创建者。有关详细信息,请参阅

  • 在调用
    startActivity()
    之前,实际上没有向意图添加任何额外内容。关于建议,请参见第1点

  • 我认为您需要解决所有这些问题才能使其正常工作。

    Mike dg是正确的


    putExtra()
    getSerializable()
    将存储和检索自定义对象的
    ArrayList
    ,无需接口实现。为我工作

    它可以做得简单得多,而不需要在实现
    Parcelable
    的过程中经历所有痛苦。。。
    ArrayList
    (但不是任何
    列表
    )可
    序列化。因此,正如Sam所说,您可以使用
    putExtra()
    放置整个列表,并使用
    getSerializableExtra()
    检索它

    但是,我想添加一件更重要的事情:数组列表存储的对象也必须实现
    Serializable
    。。。并且该对象可能包含的所有其他复杂对象(在您的情况下没有)必须