所以我昨天大部分时间都在谷歌上搜索,并且似乎无法绕过如何将一个arraylist传递给一个sublativity。有大量的示例和片段传递原始数据类型,但我所拥有的是类型地址(下面的地址.java)的arraylist。
我已经在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 ());
}
}
}
答案 0 :(得分:23)
我可以在这里看到许多问题:
为什么要使用addressParcelable?为什么不使地址实现Parcelable,然后使用:
intent.putParcelableArrayListExtra( "addresses", addyExtras );
您的parcelable对象必须包含静态CREATOR。有关详细信息,请参阅documentation。
在致电startActivity()
之前,您实际上并未向意图添加任何额外内容。有关建议,请参见第1点。
我认为您需要解决所有这些问题才能使其正常运行。
答案 1 :(得分:8)
可以做得更简单,没有实施Parcelable
的所有痛苦......
ArrayList
(但不是任何List
)是Serializable
。因此,您可以使用putExtra()
放置整个列表,并使用getSerializableExtra()
检索它,正如Sam所说。
但是,我想添加一个更重要的事情:数组列表存储的对象也必须实现Serializable
...并且对象可能包含的所有其他复杂对象(在您的情况下为none)也必须实现它(所以它是递归的 - 为了序列化一个对象,你必须能够序列化它的所有字段。)
现在,您可能会问自己为什么在已经有读取和编写parcelables数组列表的方法时实现Serializable
而不是Parcelable
?
嗯......区别在于简单 - 只需添加implements Serializable
和private static final long serialVersionUID = SOME_CONSTANT
,您就可以了!这就是为什么我从不使用Parcelable
的原因 - 你可以使用Serializable
使用2行代码来完成所有这些事情 - 而不是许多方法继承和所有这些...
答案 2 :(得分:6)
您可以通过putExtra传递Serializable对象。 ArrayList实现了Serializable。
答案 3 :(得分:6)
Mike dg是对的!
putExtra()
和getSerializable()
将存储和检索ArrayList<>
个自定义对象,无需实现任何接口。为我工作!