Android 帮助传递ArrayList和parcelable活动
所以我昨天和昨晚大部分时间都在谷歌上搜索,似乎都不知道如何将arraylist传递给subactivity。有大量的示例和代码片段传递基本数据类型,但我有一个address类型的arraylist(下面是address.java) 我在stackoverflow和网络上找到了很多关于这个的东西,但是除了一个GeoPoint的例子之外,没有什么引起了人们的注意。再一次,在我看来,他们只是将GeoPoint对象展平为两个整数,然后将其传入。我不能这样做,因为我的address类可能会扩展为包含整数、浮点等。现在,为了简单起见,下面的测试应用程序只有两个字符串。我想如果我能让parcelalbe的东西用它工作,其他的就可以了 有人可以发布一个非原语对象的ArrayList的工作示例,或者在下面添加代码来实现这一点吗 更新:回复/编辑后,下面的代码正在运行。谢谢Android 帮助传递ArrayList和parcelable活动,android,android-activity,parcelable,Android,Android Activity,Parcelable,所以我昨天和昨晚大部分时间都在谷歌上搜索,似乎都不知道如何将arraylist传递给subactivity。有大量的示例和代码片段传递基本数据类型,但我有一个address类型的arraylist(下面是address.java) 我在stackoverflow和网络上找到了很多关于这个的东西,但是除了一个GeoPoint的例子之外,没有什么引起了人们的注意。再一次,在我看来,他们只是将GeoPoint对象展平为两个整数,然后将其传入。我不能这样做,因为我的address类可能会扩展为包含整数、
/* 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实现了可序列化。我可以在这里看到一些问题:
intent.putParcelableArrayListExtra( "addresses", addyExtras );
startActivity()
之前,实际上没有向意图添加任何额外内容。关于建议,请参见第1点putExtra()
和getSerializable()
将存储和检索自定义对象的ArrayList
,无需接口实现。为我工作 它可以做得简单得多,而不需要在实现Parcelable
的过程中经历所有痛苦。。。
ArrayList
(但不是任何列表
)可序列化。因此,正如Sam所说,您可以使用putExtra()
放置整个列表,并使用getSerializableExtra()
检索它
但是,我想添加一件更重要的事情:数组列表存储的对象也必须实现Serializable
。。。并且该对象可能包含的所有其他复杂对象(在您的情况下没有)必须