如何使用不同 activity 中的两个数组适配器更新一个数组列表中的数据
How to update data in one arraylist with two arrayadapter in different activity
我正在尝试将两个不同的 ArrayAdapter(分别分成两个 Activity)和一个 Arraylist。第一个 ArrayAdapter 执行数量的增量,第二个执行减量。然后将第一个ArrayAdapter中的所有Data传输到第二个ArrayAdapter,但只会显示Quantity大于1的Data。之前的所有任务似乎都工作正常,直到我尝试减少一个数量(它显示数据减少)并尝试通过返回第一个 Activity 并再次返回来检查更改是否已保存第二 Activity。发生的情况是,由递减所做的更改被忽略,并重置项目递增时的数据。我知道它有点乱,但我希望你能帮助我,我做错了什么。
编辑:我正在使用两个 ArrayAdapter,因为我想在第二个适配器中显示数量以及其他元素。
这是我的代码:
myProductAdapter.java(增量适配器)
public class myProductAdapter extends ArrayAdapter<myProduct> {
public class ViewHolder{
Button addItem;
}
public myProductAdapter(Context context, ArrayList<myProduct> myProducts) {
super(context, 0, myProducts);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final myProduct product = getItem(position);
final ViewHolder viewHolder;
//Some Codes Here..
viewHolder.addItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
product.productQuantity ++;
Toast.makeText(getContext(), "" + product.productQuantity(), Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}
myOrderAdapter.java(减速适配器)
public class myOrderAdapter extends ArrayAdapter<myProduct> {
public class ViewHolder{
Button minusItem;
}
public myOrderAdapter(Context context, ArrayList<myProduct> orders){
super(context, 0, orders);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final myProduct order = getItem(position);
viewHolder.minusItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
order.productQuantity --;
if(order.productQuantity() <= 0){
order.productQuantity = 0;
notifyDataSetChanged();
}
Toast.makeText(getContext(),"" + order.productQuantity(),Toast.LENGTH_SHORT).show();
return convertView;
}
}
myProduct.java
public class myProduct implements Parcelable {
@SerializedName("productID")
public int productID;
@SerializedName("categoryID")
public int categoryID;
@SerializedName("productName")
public String productName;
@SerializedName("productPrice")
public int productPrice;
public int productQuantity = 0;
public myProduct(int productID, int categoryID, String productName, int productPrice){
this.productID = productID;
this.categoryID = categoryID;
this.productName = productName;
this.productPrice = productPrice;
}
public int getProductID(){
return productID;
}
public int getCategoryID(){
return categoryID;
}
public String getProductName(){
return productName;
}
public int getProductPrice(){
return productPrice;
}
public int productQuantity() {
return productQuantity;
}
protected myProduct(Parcel in) {
productID = in.readInt();
categoryID = in.readInt();
productName = in.readString();
productPrice = in.readInt();
productQuantity = in.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(productID);
dest.writeInt(categoryID);
dest.writeString(productName);
dest.writeInt(productPrice);
dest.writeInt(productQuantity);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<myProduct> CREATOR = new Parcelable.Creator<myProduct>() {
@Override
public myProduct createFromParcel(Parcel in) {
return new myProduct(in);
}
@Override
public myProduct[] newArray(int size) {
return new myProduct[size];
}
};
}
Menu.class
viewOrder = (Button)findViewById(R.id.viewOrder);
viewOrder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(Menu.this, Order.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("productList", productList);
i.putExtras(bundle);
startActivity(i);
}
});
Order.class
Bundle bundle = getIntent().getExtras();
productList = bundle.getParcelableArrayList("productList");
filter = new ArrayList<myProduct>();
orderAdapter = new myOrderAdapter(getApplicationContext(),filter);
for(myProduct item : productList){
if(item.productQuantity > 0){
Log.d(TAG,item.getProductName());
Log.d(TAG,"" + item.productQuantity());
filter.add(item);
}
else if(item.productQuantity <= 0){
filter.remove(item);
}
}
orderListView.setAdapter(orderAdapter);
问题是您将数组作为 Parcelable 传递给第二个适配器,因此它基本上是对数组进行深度复制,与原始数组无关。因此,第二个数组中的更改不会显示在第一个数组中。
一个简单(但可能很脏)的解决方案是将数组作为静态变量(或应用程序的一部分 class,或单例),并在两个活动中使用实际数组。
如果您可以设计,两个列表都在两个片段中,并且是一个 activity 的一部分,那么只需让 activity 保留两个片段的共享数组。
我正在尝试将两个不同的 ArrayAdapter(分别分成两个 Activity)和一个 Arraylist。第一个 ArrayAdapter 执行数量的增量,第二个执行减量。然后将第一个ArrayAdapter中的所有Data传输到第二个ArrayAdapter,但只会显示Quantity大于1的Data。之前的所有任务似乎都工作正常,直到我尝试减少一个数量(它显示数据减少)并尝试通过返回第一个 Activity 并再次返回来检查更改是否已保存第二 Activity。发生的情况是,由递减所做的更改被忽略,并重置项目递增时的数据。我知道它有点乱,但我希望你能帮助我,我做错了什么。
编辑:我正在使用两个 ArrayAdapter,因为我想在第二个适配器中显示数量以及其他元素。
这是我的代码:
myProductAdapter.java(增量适配器)
public class myProductAdapter extends ArrayAdapter<myProduct> {
public class ViewHolder{
Button addItem;
}
public myProductAdapter(Context context, ArrayList<myProduct> myProducts) {
super(context, 0, myProducts);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final myProduct product = getItem(position);
final ViewHolder viewHolder;
//Some Codes Here..
viewHolder.addItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
product.productQuantity ++;
Toast.makeText(getContext(), "" + product.productQuantity(), Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}
myOrderAdapter.java(减速适配器)
public class myOrderAdapter extends ArrayAdapter<myProduct> {
public class ViewHolder{
Button minusItem;
}
public myOrderAdapter(Context context, ArrayList<myProduct> orders){
super(context, 0, orders);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final myProduct order = getItem(position);
viewHolder.minusItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
order.productQuantity --;
if(order.productQuantity() <= 0){
order.productQuantity = 0;
notifyDataSetChanged();
}
Toast.makeText(getContext(),"" + order.productQuantity(),Toast.LENGTH_SHORT).show();
return convertView;
}
}
myProduct.java
public class myProduct implements Parcelable {
@SerializedName("productID")
public int productID;
@SerializedName("categoryID")
public int categoryID;
@SerializedName("productName")
public String productName;
@SerializedName("productPrice")
public int productPrice;
public int productQuantity = 0;
public myProduct(int productID, int categoryID, String productName, int productPrice){
this.productID = productID;
this.categoryID = categoryID;
this.productName = productName;
this.productPrice = productPrice;
}
public int getProductID(){
return productID;
}
public int getCategoryID(){
return categoryID;
}
public String getProductName(){
return productName;
}
public int getProductPrice(){
return productPrice;
}
public int productQuantity() {
return productQuantity;
}
protected myProduct(Parcel in) {
productID = in.readInt();
categoryID = in.readInt();
productName = in.readString();
productPrice = in.readInt();
productQuantity = in.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(productID);
dest.writeInt(categoryID);
dest.writeString(productName);
dest.writeInt(productPrice);
dest.writeInt(productQuantity);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<myProduct> CREATOR = new Parcelable.Creator<myProduct>() {
@Override
public myProduct createFromParcel(Parcel in) {
return new myProduct(in);
}
@Override
public myProduct[] newArray(int size) {
return new myProduct[size];
}
};
}
Menu.class
viewOrder = (Button)findViewById(R.id.viewOrder);
viewOrder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(Menu.this, Order.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("productList", productList);
i.putExtras(bundle);
startActivity(i);
}
});
Order.class
Bundle bundle = getIntent().getExtras();
productList = bundle.getParcelableArrayList("productList");
filter = new ArrayList<myProduct>();
orderAdapter = new myOrderAdapter(getApplicationContext(),filter);
for(myProduct item : productList){
if(item.productQuantity > 0){
Log.d(TAG,item.getProductName());
Log.d(TAG,"" + item.productQuantity());
filter.add(item);
}
else if(item.productQuantity <= 0){
filter.remove(item);
}
}
orderListView.setAdapter(orderAdapter);
问题是您将数组作为 Parcelable 传递给第二个适配器,因此它基本上是对数组进行深度复制,与原始数组无关。因此,第二个数组中的更改不会显示在第一个数组中。
一个简单(但可能很脏)的解决方案是将数组作为静态变量(或应用程序的一部分 class,或单例),并在两个活动中使用实际数组。
如果您可以设计,两个列表都在两个片段中,并且是一个 activity 的一部分,那么只需让 activity 保留两个片段的共享数组。