繁体   English   中英

Android-如何将Textview值从Activity-A传递到适配器

[英]Android - How do you pass textview values from Activity-A to an adapter

我正在开发一个购物车应用程序,我需要一些有关适配器的帮助。 我试图在这里回答类似的问题但这与我的情况有些不同。 我有3个类: MakeSale.javaDetailsActivity.javaShoppingCartListAdapter.java 所以,这是流程。

MakeSale.java ,我声明了两个数组列表,第一个数组是cartItemArrayList商店要由客户购买的商品。 这些是生产商名称,产品名称,数量,unitCost,第二个是cartCostItemsList保存购物车中商品的总成本。

内部MakeSale.java

public static List<CartItem> cartItemArrayList = new ArrayList<>();
public static List<Double> cartCostItemsList = new ArrayList<>();

然后,我有一个扩展ArrayAdapter的适配器类。 此类链接到显示在列表视图上的XML list_item 现在,此list_item仅显示生产商名称,产品名称,总数量,添加到购物车的每件商品的总成本。 当用户想要对列表视图上的项目进行更改(增加或减少要购买的项目数量)时, list_item已变为可单击。

内部ShoppingCartListAdapter.java

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.zynle.fisp_dealer.Dashboard;
import com.zynle.fisp_dealer.DetailsActivity;
import com.zynle.fisp_dealer.MakeSale;
import com.zynle.fisp_dealer.R;

import java.util.List;
import entities.CartItem;


public class ShoppingCartListAdapter extends ArrayAdapter<CartItem> {

private Context context;
private List<CartItem> cartItems;

public ShoppingCartListAdapter(Context context, List<CartItem> cartItems) {
    super(context, R.layout.list_item, cartItems);
    this.context = context;
    this.cartItems = cartItems;

}

public int getCount() {
    return cartItems.size();
}

public CartItem getItem(int position) {
    return cartItems.get(position);
}

public long getItemId(int position) {
    return cartItems.get(position).getId();
}


@NonNull
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater layoutInflater = (LayoutInflater) context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    final CartItem currentProduct = getItem(position);

    View view = layoutInflater.inflate(R.layout.list_item, parent, false);

    TextView productName_txtv = (TextView) view.findViewById(R.id.nameTextView);
    TextView producerName_txtv = (TextView) view.findViewById(R.id.producerTextView);
    TextView productQuantity_txtv = (TextView) view.findViewById(R.id.qtyTextView);
    TextView productCost_txtv = (TextView) view.findViewById(R.id.priceTextView);

    productName_txtv.setText(cartItems.get(position).getProduct_txt());
    producerName_txtv.setText(cartItems.get(position).getProducer_txt());
    productQuantity_txtv.setText(String.valueOf(cartItems.get(position).getQuantity()));
    productCost_txtv.setText(String.valueOf(cartItems.get(position).getCost_txt()));

    productName_txtv.setText(currentProduct.getProduct_txt());

    int perItem = currentProduct.getCost_txt();
    int quantitee = currentProduct.getQuantity();

    final int total = perItem * quantitee;

    productCost_txtv.setText("Total: K" + total);
    productQuantity_txtv.setText(currentProduct.getQuantity() + " Selected");

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent detailsIntent = new Intent(context, DetailsActivity.class);
            detailsIntent.putExtra("name", currentProduct.getProduct_txt());
            detailsIntent.putExtra("quantity", currentProduct.getQuantity());
            detailsIntent.putExtra("total", total);
            context.startActivity(detailsIntent);
        }
    });

    return view;
}


public void makeNewSale() {
    if (getCount() == 0) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.Theme_AppCompat_Light_Dialog_Alert);
        builder.setTitle(R.string.app_name);
        builder.setIcon(R.mipmap.ic_launcher);
        builder.setMessage("Cart is Empty!")
                .setCancelable(false)
                .setPositiveButton("Add new items", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        Intent intent = new Intent(getContext(), MakeSale.class);
                        getContext().startActivity(intent);

                    }
                })
                .setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Intent intent = new Intent(getContext(), Dashboard.class);
                        getContext().startActivity(intent);
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }
}

}

从意图DetailsActivity.java ,我的代码处理了有关增加和减少按钮单击的数量的所有逻辑,该代码位于一个名为DetailsActivity.java的类中。 当然DetailsActivity.java链接到一些xml文件。

内部详细信息DetailsActivity.java

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

import database.FISP_SQLiteDB;
import entities.CartItem;
import entities.Products;

public class DetailsActivity extends AppCompatActivity {

ImageView imageView;
TextView nameTextView, priceTextView, qtyTextView, available;
Button increaseQtyButton, decreaseQtyButton, contactSupplierButton, deleteButton, confirmButton;

private List<CartItem> cartItems;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    // Get any data passed in from Fragment
    Intent detailsIntent = getIntent();
    final String name = detailsIntent.getStringExtra("name");

    imageView = (ImageView) findViewById(R.id.imageView);
    nameTextView = (TextView) findViewById(R.id.nameTextView);
    available = (TextView) findViewById(R.id.availableQTY);
    priceTextView = (TextView) findViewById(R.id.priceTextView);
    qtyTextView = (TextView) findViewById(R.id.qtyText);
    increaseQtyButton = (Button) findViewById(R.id.increaseQtyButton);
    decreaseQtyButton = (Button) findViewById(R.id.decreaseQtyButton);
    contactSupplierButton = (Button) findViewById(R.id.contactSupplierButton);
    deleteButton = (Button) findViewById(R.id.deleteProductButton);
    confirmButton = (Button) findViewById(R.id.confirm);

    nameTextView.setText(name);

    int quantityPicker = Integer.parseInt(MakeSale.quantityPicker_Npkr.getText().toString());
    qtyTextView.setText("" + quantityPicker);

    final FISP_SQLiteDB db = new FISP_SQLiteDB(DetailsActivity.this);
    final Products product = db.getProduct(name);

    if (product != null) {

        final double productPrice = (product.getPrice() * quantityPicker);
        final int subQuantity = (product.getQuantity() - quantityPicker);

        priceTextView.setText("K" + productPrice);
        available.setText("Available Quantity is " + subQuantity);

        final int[] counter = {quantityPicker};
        final int[] counter1 = {quantityPicker};
        final int[] minteger = {1};

        increaseQtyButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                qtyTextView.setText(String.valueOf(counter[0]++));
                int reducingQty = (subQuantity - counter1[0]++);
                double totalingPrice = productPrice + (product.getPrice()* minteger[0]++);
                available.setText(String.valueOf("Available Quantity is " + reducingQty));
                priceTextView.setText("K" + totalingPrice);

                decreaseQtyButton.setEnabled(true);

                if(reducingQty==0){
                    increaseQtyButton.setEnabled(false);
                    decreaseQtyButton.setEnabled(true);

                }
            }
        });

        decreaseQtyButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                qtyTextView.setText(String.valueOf(counter[0]--));
                int increasingQty = (subQuantity - counter1[0]--);
                double totalingPrice = productPrice - (product.getPrice()* minteger[0]--);
                available.setText(String.valueOf("Available Quantity is " + increasingQty));
                priceTextView.setText("K" + totalingPrice);

                increaseQtyButton.setEnabled(true);

                if (increasingQty==product.getQuantity()){
                    increaseQtyButton.setEnabled(true);
                    decreaseQtyButton.setEnabled(false);

                }
            }
        });

        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case DialogInterface.BUTTON_POSITIVE:

                                //db.deleteProduct(name);
                                finish();
                                break;

                            case DialogInterface.BUTTON_NEGATIVE:
                                break;
                        }
                    }
                };
                AlertDialog.Builder ab = new AlertDialog.Builder(DetailsActivity.this, R.style.MyDialogTheme);
                ab.setMessage("Delete " + name + " ?").setPositiveButton("DELETE", dialogClickListener)
                        .setNegativeButton("CANCEL", dialogClickListener).show();
            }
        });


        contactSupplierButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                // Creating alert Dialog with two Buttons
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(DetailsActivity.this, R.style.MyDialogTheme);
                // Setting Dialog Title
                alertDialog.setTitle("Do you want to call?");
                // Setting Dialog Message
                alertDialog.setMessage("" + product.getSupplierName());
                // Setting Icon to Dialog
                //alertDialog.setIcon(R.drawable.warning);
                // Setting Negative "NO" Button
                alertDialog.setNegativeButton("No",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                                int which) {
                                // Write your code here to execute after dialog
                                dialog.cancel();
                            }
                        });
                // Setting Positive "Yes" Button
                alertDialog.setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                                int which) {
                                // Write your code here to execute after dialog
                                Intent callIntent = new Intent(Intent.ACTION_CALL);
                                //callIntent.setData(Uri.parse("" + product.getSupplierPhone().trim()));
                                callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                callIntent.setData(Uri.parse("tel:" + product.getSupplierPhone()));

                                if (ActivityCompat.checkSelfPermission(DetailsActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                                    return;
                                }
                                DetailsActivity.this.startActivity(callIntent);
                            }
                        });

                // Showing Alert Message
                alertDialog.show();
            }
        });

        confirmButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //CartItem cartItem = new CartItem(producer, product, quantity, unitCost);
                //cartItemArrayList.add(cartItem);

                Intent intent = new Intent(DetailsActivity.this, ShoppingCart.class);
                startActivity(intent);
            }
        });
    }
  }
}

现在,当用户单击confirmChangesBtn时,如何将这些新值(新数量,新totalCost)设置/替换到列表视图的list_item 通过这样做,可以更改数组列表( cartItemArrayListcartCostItemsList )中的产品详细信息。 DetailsActivity.java值从DetailsActivity.java传递到适配器进行显示? 我将如何处理? 任何人?

当用户从详细信息页面更改购物车值并再次以新值显示在适配器中时,您想更改适配器数据,应在Resume方法中初始化适配器视图并通知适配器视图,它可帮助您用新值重新创建视图。

@Override
    public void onResume() {
        super.onResume();
        if(arrayList.size()>0) {
            myShoppingCartAdapter.notifyDataSetChanged();
            getAllShoppingCartDetails();
        }

    }

我引用的代码比我建议在适配器中使用startActivityForResult而不是startActivity代码要多。

 view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent detailsIntent = new Intent(context, DetailsActivity.class);
            detailsIntent.putExtra("name", currentProduct.getProduct_txt());
            detailsIntent.putExtra("quantity", currentProduct.getQuantity());
            detailsIntent.putExtra("total", total);
            context.startActivityForResult(detailsIntent, 121);
        }
    });

比增加和减少数量时要多,而不是将更新后的数据添加到intent和setResult()

Intent intent = new Intent();  
intent.putExtra("MESSAGE",message);  
setResult(121,intent);
finish();

而不是在活动中处理结果

@Override  
       protected void onActivityResult(int requestCode, int resultCode, Intent data)  
       {  
           super.onActivityResult(requestCode, resultCode, data);  
           // check if the request code is same as what is passed  here it is 2  
           if(requestCode==121)  
              {  
                String message=data.getStringExtra("MESSAGE");   
                //Do you logic like update ui, list, price 
              }  
     }  

@Yokonia Tembo,

在您的侧面increaseQtyButton.setOnClickListener() DetailsActivity.java increaseQtyButton.setOnClickListener()DetailsActivity.java代码中,我没有找到MakeSales.java类的cartItemArrayList的更改过程。

我认为在适配器的notifyDataSetChanged()之前更改那些数组列表会更新CartList中的值。

除此以外,还有其他建议,如果您正在使用ShoppingCart应用,则应该为购物车商品创建一个数据库表而不是ArrayList,您将受益于以下几项内容

  • 数据库表的实现将使您的购物车中的物品可用,即使在终止并重新启动应用程序之后也是如此。
  • 您可以将观察者放在表的列上进行更新,以便增加/减少的值将通知UI更新项目

我还将在代码中包含Upendra shah的解决方案。

在编写解决方案之前,我假设您有两个活动,分别是:1. ShoppingCart.java(保留列表视图)和DetailsActivity.java。

请一一遵循。

步骤1.首先从适配器中删除Click侦听器,并在适配器中创建一个新方法,该方法将返回您的数据列表。 还要在ShoppingCart Activity中创建一个全局整数变量,该变量将保留被点击的位置;

子步骤1.A在ShoppingCart活动中创建如下所示的全局变量

// This will be updated when user clicks on any item of listview.
int clickedPosition = -1;

子步骤1.B创建适当的listview Click监听器。

view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent detailsIntent = new Intent(context, DetailsActivity.class);
            detailsIntent.putExtra("name", currentProduct.getProduct_txt());
            detailsIntent.putExtra("quantity", currentProduct.getQuantity());
            detailsIntent.putExtra("total", total);
            context.startActivity(detailsIntent);
        }
    });

删除此代码,然后转到ShoppingCart活动(存在listview对象的位置)。 写下面提到的代码。

yourListView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // updating clicked position variable on list item click.
            clickedPosition = position; 
            Intent detailsIntent = new Intent(ShopingCart.this, DetailsActivity.class);
            detailsIntent.putExtra("name", currentProduct.getProduct_txt());
            detailsIntent.putExtra("quantity", currentProduct.getQuantity());
            detailsIntent.putExtra("total", total);
            startActivityForResult(detailsIntent);
        }
    });

现在,为将返回适配器数据列表的方法编写代码。

public List<CartItems> getCartItemsFromAdapter() {
      return cartItems;
}

步骤2.在购物车活动中,覆盖onActivityResult

    @Override  
           protected void onActivityResult(int requestCode, int resultCode, Intent data)  
           {  
               super.onActivityResult(requestCode, resultCode, data);  
               if(requestCode == 121)  
                  {  
                    // Update the values according to you, I am using sample key-value.
                    String updatedCost = data.getStringExtra("updatedCost");   
                    List<CartItems> cartItems = adapter.getCartItemsFromAdapter();
                    CartItems cartItemObj = cartItems.get(clickedPosition);
                    cartItemObj.setTotalCost(updatedCost);
                    adapter.notifyDataSetChanged(); // Calling this method will quickly reflect your changes to listView.
                  }  
         }  

步骤3.最后,在您的DetailsActivity确认按钮或您要单击以反映这些更改的任何按钮上,编写以下代码。

confirmBtn.setOnClickListener(new OnclickListener{

Intent intent = new Intent();  
intent.putExtra("updatedCost", totalCostValue);  
setResult(121, intent);
finish();

});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM