Java 在意图中传递了ArrayList,但未进行任何更改?
抱歉,如果这是一个非常明显的问题。简而言之,我正在将一个arraylist从我的Java 在意图中传递了ArrayList,但未进行任何更改?,java,android,arraylist,Java,Android,Arraylist,抱歉,如果这是一个非常明显的问题。简而言之,我正在将一个arraylist从我的TshirtParadeActivity传递到ShopActivity。在ShopActivity中,我将arraylist传递给Adapter类,该类为复选框创建侦听器,以便在选中时修改arraylist 我可以在ShopActivity的onDestroy()方法中看到对原始arraylist所做的更改。但是,一旦该活动结束,我返回到tshirtpaRadiaeActivity我又有了一个空列表,即使我之前在Sh
TshirtParadeActivity
传递到ShopActivity
。在ShopActivity
中,我将arraylist传递给Adapter
类,该类为复选框创建侦听器,以便在选中时修改arraylist
我可以在ShopActivity
的onDestroy()方法中看到对原始arraylist所做的更改。但是,一旦该活动结束,我返回到tshirtpaRadiaeActivity
我又有了一个空列表,即使我之前在ShopActivity
中添加了它
如何在活动之间保持对arraylist的更改?我将代码包括在下面:
tshirtpaRadiaActivity.java
package com.bignerdranch.android.tshirtparadise;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
import java.util.List;
public class TshirtParadiseActivity extends AppCompatActivity {
private Button mSexy0;
private Button mCheckOut;
private int POOR=0;
private ArrayList<Tshirt> shoppingCart = new ArrayList<Tshirt>();
private static final int requestCodeShop=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tshirt_paradise);
mSexy0 = (Button) findViewById(R.id.sexy0);
mCheckOut = (Button) findViewById(R.id.checkout);
mCheckOut.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//ARRAYLIST IS EMPTY
for (int i=0;i<shoppingCart.size();i++){
System.out.println("you bought a " + shoppingCart.get(i).getTitle() +
" for $" + shoppingCart.get(i).getPrice());
}
}
});
mSexy0.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent i = ShopActivity.newIntent(TshirtParadiseActivity.this,0,shoppingCart);
startActivity(i);
}
});
}
}
public class ShopActivity extends AppCompatActivity {
private RecyclerView shirtRecyclerView;
// private ShirtAdapter shirtAdapter;
private int mQuality;
TshirtAdapter teeAdapter;
private List<Tshirt> teeShirtList;
private static ArrayList<Tshirt>shoppingCart;
private static final String QUALITY = "com.bignerdranch.android.tshirtparadise.muchquality";
private static String CART = "com.bignerdranch.android.tshirtparadise.cart";
private static final String BUY = "com.bignerdranch.android.tshirtparadise.buy";
public static Intent newIntent(Context context, int quality,ArrayList<Tshirt>shoppingCart){
//creates an instance of ShopActivity class
Intent i = new Intent(context,ShopActivity.class);
i.putExtra(QUALITY,quality);
i.putExtra(CART,(Serializable)shoppingCart);
return i;
}
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Activities are presented to the user
setContentView(R.layout.activity_shop);
TShirtCabinet cabinet = new TShirtCabinet();
Bundle bundle = getIntent().getExtras();
mQuality = bundle.getInt(QUALITY);
//to transform serializable to arraylist, use getSerializable(String name)
shoppingCart = (ArrayList<Tshirt>) bundle.getSerializable(CART);
teeShirtList = cabinet.getList(mQuality);
shirtRecyclerView = (RecyclerView)findViewById(R.id.tshirt_list);
shirtRecyclerView.setLayoutManager(new LinearLayoutManager(ShopActivity.this));
teeAdapter = new TshirtAdapter(teeShirtList,shoppingCart);
shirtRecyclerView.setAdapter(teeAdapter);
}
}
package com.bignerdranch.android.tshirtparisie;
导入android.content.Intent;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入java.util.ArrayList;
导入java.util.List;
公共类TshirtParadeActivity扩展了AppCompativity{
专用按钮mSexy0;
专用按钮mCheckOut;
私人智力差=0;
private ArrayList shoppingCart=新ArrayList();
私有静态最终int requestCodeShop=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u tshirt\u paradise);
mSexy0=(按钮)findViewById(R.id.sexy0);
mCheckOut=(按钮)findviewbyd(R.id.checkout);
mCheckOut.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//ARRAYLIST为空
对于(int i=0;i当您将一个对象放入一个意图中,并将其发送到另一个活动中时,在大多数情况下,您将在新的活动中得到该对象的不同实例。该列表中可能包含所有相同的值,但就程序而言,它是一个不同的列表
如果要查看第一个活动中反映的对第二个活动所做的更改,应使用活动“结果”。在第一个活动中,通过调用startActivityForResult()
而不是startActivity()
,来启动第二个活动。在第二个活动中,在调用finish之前调用setResult()
()
。然后,回到第一个活动中,通过实现onActivityResult()来处理该结果
,并在那里更新您的列表。当您将一个对象放入一个意图中,并将其发送到另一个活动中时,在大多数情况下,您将在新的活动中得到该对象的不同实例。该列表中可能包含所有相同的值,但就e程序是相关的
如果要查看第一个活动中反映的对第二个活动所做的更改,应使用活动“结果”。在第一个活动中,通过调用startActivityForResult()
而不是startActivity()
,来启动第二个活动。在第二个活动中,在调用finish之前调用setResult()
()
。然后,回到第一个活动中,通过实现onActivityResult()来处理该结果
,并在那里更新您的列表。谢谢,您知道为什么它是新活动中对象的另一个实例吗?@st4rgut,您需要研究core android arch来解决这个问题。当您使用可序列化
接口传输对象时,它会复制对象(新实例)。因此i.putExtra(CART,(可序列化)购物车);
将发送制作shoppingCart
副本所需的数据,但它不会引用原始实例。谢谢,你知道为什么它是新活动中对象的另一个实例吗?@st4rgut,你需要研究core android arch来解决这个问题。当你使用可序列化的传输对象时>接口,它将复制对象(新实例)。因此,i.putExtra(购物车,(可序列化)shoppingCart);
将发送复制shoppingCart
所需的数据,但它不会引用原始实例。
public class TshirtAdapter extends RecyclerView.Adapter<TshirtAdapter.ShirtHolder>{
private String TAG = "TshirtAdapter";
private List<Tshirt> teeList;
private Context mContext;
private static ArrayList<Tshirt> shoppingCart;
public TshirtAdapter(List<Tshirt> teeShirts,ArrayList<Tshirt>cart){
teeList = teeShirts;
shoppingCart = cart;
}
@Override
public TshirtAdapter.ShirtHolder onCreateViewHolder(ViewGroup parent, int viewType){
mContext = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(mContext);
View viewHolder = inflater.inflate(R.layout.list_item_tshirt,parent,false);
return new ShirtHolder(viewHolder);
}
public class ShirtHolder extends RecyclerView.ViewHolder{
//render the view, don't add data yet
private TextView title;
private CheckBox bought;
private ImageView preview;
private TextView price;
public ShirtHolder(View itemView){
super(itemView);
title = itemView.findViewById(R.id.tshirt_title);
bought = itemView.findViewById(R.id.tshirt_checkbox);
preview = itemView.findViewById(R.id.tshirt_picture);
price = itemView.findViewById(R.id.tshirt_price);
}
public void bindShirt(final Tshirt tee){
title.setText(tee.getTitle());
price.setText(tee.getPrice());
bought.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton btn,boolean isChecked){
if (btn.isChecked()){
shoppingCart.add(tee);
Log.d(TAG,"adding tee " + tee);
}
else {
shoppingCart.remove(tee);
Log.d(TAG,"removing tee " + tee);
}
}
});
if (android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.LOLLIPOP){
preview.setImageDrawable(mContext.getApplicationContext().getDrawable(R.drawable.blue));
}
else {
preview.setImageDrawable(mContext.getResources().getDrawable(R.drawable.blue));
}
}
}
@Override
public void onBindViewHolder(ShirtHolder shirtHolder, int position){
Tshirt t = teeList.get(position);
shirtHolder.bindShirt(t);
}
@Override
public int getItemCount(){
return teeList.size();
}
public ArrayList<Tshirt>getShoppingCart(){
return shoppingCart;
}