帮助传递ArrayList和parcelable Activity

wuf*_*foo 31 android parcelable android-activity

所以我昨天一直在谷歌上搜索大部分时间,并且似乎无法绕过如何将一个arraylist传递给一个sublativity.有大量的示例和片段传递原始数据类型,但我所拥有的是类型为address的arraylist (下面是address.java).

我已经在stackoverflow和网络上发现了很多东西,但除了一个带有GeoPoint示例的东西之外没什么值得关注的.再次,它看起来像他们只是将GeoPoint对象扁平化为两个整数并将其传入.我不能这样做,因为我的地址类可能会扩展为包括整数,浮点数等等.现在,为简单起见,下面的测试应用程序只有两个字符串.我想如果我可以让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 ());
       }

    }

}
Run Code Online (Sandbox Code Playgroud)

Mar*_*son 23

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

  1. 为什么要使用addressParcelable?为什么不使地址实现Parcelable,然后使用:

    intent.putParcelableArrayListExtra( "addresses", addyExtras );
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您的parcelable对象必须包含静态CREATOR.有关详细信息,请参阅文档

  3. 在调用之前,您实际上并未向意图添加任何额外内容startActivity().有关建议,请参见第1点.

我认为您需要解决所有这些问题才能使其正常运行.

  • 我认为你需要调用getIntent().getParcelableArrayList("mylist"),而不是savedInstanceState.getParcelableArrayList("mylist"); (3认同)

Dex*_*ter 8

它可以做得更简单,没有实施的所有痛苦Parcelable...... ArrayList(但不是任何List)是Serializable.因此,您可以使用整个列表putExtra()并使用它来检索它getSerializableExtra(),正如Sam所说.

但是,我想添加一个更重要的事情:数组列表存储的对象也必须实现Serializable...对象可能包含的所有其他复杂对象(在你的情况下没有)也必须实现它(所以它是递归的 - 在为了序列化对象,您必须能够序列化其所有字段).

现在,你可能会问自己为什么要实现Serializable而不是Parcelable已经有读取和编写parcelables数组列表的方法?嗯......不同的是简单-只需要添加implements Serializable和可选private static final long serialVersionUID = SOME_CONSTANT,你就大功告成了!这就是我从不使用的原因Parcelable- 你可以使用Serializable2行代码完成所有这些事情- 而不是许多方法继承和所有这些东西......

  • [Parcelable over Serializable](http://www.developerphil.com/parcelable-vs-serializable)的优势在于它更快**.如果您的清单很大,差异可能会很明显. (5认同)

Mik*_* dg 6

您可以通过putExtra传递Serializable对象.ArrayList实现Serializable.


小智 6

Mike dg是对的!

putExtra()并且getSerializable()将存储和检索ArrayList<>您的自定义对象,并实现无需接口.为我工作!