如何使用不同 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 保留两个片段的共享数组。