如何使用两个不同活动的arrayadapter更新一个arraylist中的数据

时间:2016-08-28 18:19:04

标签: java android arraylist android-arrayadapter

我正在尝试使用两个不同的ArrayAdapter(分别用于两个Activity)和一个Arraylist。第一个ArrayAdapter执行Quantity的Increment,第二个执行Decrement。然后,第一个ArrayAdapter的所有数据都将传输到第二个ArrayAdapter,但只会显示数量大于1的数据。所有上一个任务似乎都工作正常,直到我尝试减少数量(它显示数据欺骗)并尝试通过返回第一个活动并再次返回到第二个活动来检查是否保存了更改。会发生什么变化是由于递减所做的更改被忽略并重置项目增加时的数据。我知道它有点搞砸了,但我希望你能帮助我,我做错了什么。

编辑:我正在使用两个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(Decerement Adapter)

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);

1 个答案:

答案 0 :(得分:0)

问题是您将数组作为Parcelable传递给第二个适配器,因此它基本上是对数组进行深度复制,并且与原始数组无关。因此第二个数组中的更改不会显示在第一个数组中。
&#xA;一个简单(但可能很脏)的解决方案是将数组作为静态变量(或应用程序类的一部分,或单个),并在两个活动中使用实际数组。
&#xA;如果你可以设计,两个列表都是两个片段,并且是一个活动的一部分,那么只需要将活动保留在两个片段的共享数组上。

&#xA;