【问题标题】:How to get all values from text view of custom list view如何从自定义列表视图的文本视图中获取所有值
【发布时间】:2017-07-26 10:20:22
【问题描述】:

我想从列表视图中获取文本视图的所有值。我怎么能做到。我有一个列表视图并将数组列表放在列表视图中。我的列表视图是自定义列表视图。我想从价格文本视图中获取所有数据,然后我想显示总价格。我做了一些代码,但给出了一些错误
这是我的代码。

public class SelectedProductFromShopingCartShow extends AppCompatActivity {

    ArrayList<ShowProducts> arrayList = new ArrayList<>();
    String condition = "SelectedItemsFromShoppingCart";
    CustomAdapter customAdapter;
    ListView listView;
    TextView tvTotal;
    int total;
    private static final String TAG = "SelectedProductFromShop";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_selected_product_from_shoping_cart_show);
        listView = (ListView) findViewById(R.id.listViewSelectedItemsOfShopingCart);
        tvTotal = (TextView) findViewById(R.id.tvTotal);

        arrayList = (ArrayList<ShowProducts>) getIntent().getSerializableExtra("selectedList");

        customAdapter = new CustomAdapter(SelectedProductFromShopingCartShow.this, R.layout.show_selected_item_of_shopingcart, condition, arrayList);
        listView.setAdapter(customAdapter);
        total = getTotal(listView);
        tvTotal.setText(String.valueOf(total).toString());
    }

    public int getTotal(ListView listView) {
        int sum = 0;
        for (int i = 0; i < listView.getCount(); i++) {
            Log.d(TAG, "getTotal: "+listView.getCount());
            Log.d(TAG, "getTotal: "+arrayList.size());
            View view = listView.getChildAt(i);
            TextView tvprice = (TextView) view.findViewById(R.id.tvSetPriceOfSeletedItem);
            TextView tvquantity = (TextView) view.findViewById(R.id.tvQunatitySetOfSelectedItem);

            int price = Integer.parseInt(tvprice.getText().toString());
            int quantity = Integer.parseInt(tvquantity.getText().toString());
            sum = sum + price * quantity;
        }
        return sum;

    }
}

这是我的错误。我不知道我该怎么做。请帮帮我。

07-26 18:03:49.404 21155-21155/com.sizdom.sizdomstockmanager E/AndroidRuntime: FATAL EXCEPTION: main
                                                                               java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sizdom.sizdomstockmanager/com.sizdom.sizdomstockmanager.SelectedProductFromShopingCartShow}: java.lang.NullPointerException
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2204)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254)
                                                                                   at android.app.ActivityThread.access$600(ActivityThread.java:141)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                   at android.os.Looper.loop(Looper.java:137)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5069)
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:511)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                                                                                   at dalvik.system.NativeStart.main(Native Method)
                                                                                Caused by: java.lang.NullPointerException
                                                                                   at com.sizdom.sizdomstockmanager.SelectedProductFromShopingCartShow.getTotal(SelectedProductFromShopingCartShow.java:88)
                                                                                   at com.sizdom.sizdomstockmanager.SelectedProductFromShopingCartShow.onCreate(SelectedProductFromShopingCartShow.java:38)
                                                                                   at android.app.Activity.performCreate(Activity.java:5104)
                                                                                   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1092)
                                                                                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2254) 
                                                                                   at android.app.ActivityThread.access$600(ActivityThread.java:141) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                                   at android.os.Looper.loop(Looper.java:137) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5069) 
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                   at java.lang.reflect.Method.invoke(Method.java:511) 
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
                                                                                   at dalvik.system.NativeStart.main(Native Method) 

我查看了多个网站的解决方案。但我没有找到任何解决方案

自定义适配器

public class CustomAdapter extends ArrayAdapter {
    private List<Integer> list;
    private List<ShowProducts> listShowProducts;
    private Context context;
    private int resource;
    private String condition;
    String uri;
    private static final String TAG = "CustomAdapter";
    int i = 0;

    public CustomAdapter(@NonNull Context context, @LayoutRes int resource, List<ShowProducts> objects) {
        super(context, resource, objects);
        this.context = context;
        this.resource = resource;
        this.listShowProducts = objects;
    }

    @Override
    public int getCount() {
        return super.getCount();
    }

    @Nullable
    @Override
    public Object getItem(int position) {
        return super.getItem(position);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        View view = LayoutInflater.from(context).inflate(resource, parent, false);   
            final ShowProducts showProducts = listShowProducts.get(position);

            ImageView imageView = (ImageView) view.findViewById(R.id.imageViewOfSelecteditem);
            ImageView plus = (ImageView) view.findViewById(R.id.imageviewPlus);
            ImageView minus = (ImageView) view.findViewById(R.id.imageviewminus);
            TextView tvSetNameOfSeletedItem = (TextView) view.findViewById(R.id.tvSetNameOfSeletedItem);
            TextView tvSetSizeOfSeletedItem = (TextView) view.findViewById(R.id.tvSetSizeOfSeletedItem);
            TextView tvSetPriceOfSeletedItem = (TextView) view.findViewById(R.id.tvSetPriceOfSeletedItem);
            final TextView tvQunatitySetOfSelectedItem = (TextView) view.findViewById(R.id.tvQunatitySetOfSelectedItem);
           tvSetNameOfSeletedItem.setText(showProducts.getProduct_name().toString());
            tvSetSizeOfSeletedItem.setText(showProducts.getSize_name());
            tvSetPriceOfSeletedItem.setText(String.valueOf(showProducts.getSize_price()).toString());
            uri = showProducts.getProduct_photo().toString();

            Picasso.with(context).load(uri).into(imageView);

            plus.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int a=Integer.parseInt(tvQunatitySetOfSelectedItem.getText().toString());
                    a++;
                    if (a<=showProducts.getSize_quantity())
                    tvQunatitySetOfSelectedItem.setText(String.valueOf(a).toString());
                }
            });

            minus.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int a=Integer.parseInt(tvQunatitySetOfSelectedItem.getText().toString());
                    a--;
                    if (a>0)
                    tvQunatitySetOfSelectedItem.setText(String.valueOf(a).toString());
                }
            });
        }
        return view;
    }
}

这是我的列表视图,它在我获得价值时显示价值,但看起来很糟糕

我调试应用程序

 public int getTotal(ListView listView) {
        int sum = 0;
        for (int i = 0; i < listView.getCount(); i++) { // i=0;
            Log.d(TAG, "getTotal: "+listView.getCount()); 
            Log.d(TAG, "getTotal: "+arrayList.size()); // arraylist=4;
            View view = listView.getChildAt(i); //view=null;
            TextView tvprice = (TextView) view.findViewById(R.id.tvSetPriceOfSeletedItem);
            Log.d(TAG, "getTotal: "+tvprice.getText());
            TextView tvquantity = (TextView) view.findViewById(R.id.tvQunatitySetOfSelectedItem);

【问题讨论】:

  • 我猜你的适配器中有一个列表或数组,其中包含数据。你为什么不遍历它并计算总和?可以分享一下适配器代码吗?

标签: android listview arraylist textview onitemclicklistener


【解决方案1】:

您没有在 tvprice 中设置任何价格,在 tvquantity textView 中设置数量。因此是一个空值。

【讨论】:

    【解决方案2】:

    由于您没有在数组列表中添加任何值,这就是您收到空指针异常的原因 首先调用如下函数在您的数组列表中添加元素。然后就可以得到总价了。

        private void addProducts() {
            ShowProducts products = new ShowProducts();
            products.price = 100;
            products.quantity = 10;
            arrayList.add(products);
            }
    
    @Override
        protected void onCreate(Bundle savedInstanceState) {
    // your code
    addProducts();
    //yourcode
    }
    

    你可以使用下面的函数来得到总和

    private int total() {
    int sum = 0;
    for(ShowProducts product: arraylist) {
    sum += product.price;
    }
    

    【讨论】:

    • arrayList = (ArrayList) getIntent().getSerializableExtra("selectedList");
    • 我的数组列表有值。因为我的列表视图显示了结果。所有价格和数量均已显示,但未汇总
    • 这些行中的哪一行在第 88 行。View view = listView.getChildAt(i); TextView tvprice = (TextView) view.findViewById(R.id.tvSetPriceOfSeletedItem); TextView tvquantity = (TextView) view.findViewById(R.id.tvQunatitySetOfSelectedItem);
    • TextView tvprice = (TextView) view.findViewById(R.id.tvSetPriceOfSeletedItem);
    • 告诉我请我添加图片
    【解决方案3】:

    ListView 从您的ArrayList&lt;ShowProducts&gt; arrayList 加载数据

    如果您的视图更新,请在arrayList 中更新您的模型。

    然后你想得到所有产品的总价值,只要通过你的arrayList计算就可以了。不要碰View

    首先,确保您的模型包含 2 个字段:quantityprice。 其次,在 Adapter 中定义 2 个方法

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    
        View view = LayoutInflater.from(context).inflate(resource, parent, false);
        ShowProducts showProducts = listShowProducts.get(position);
        // Handle your views...
    
        plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int quantity = Integer.valueOf(tvQunatitySetOfSelectedItem.getText().toString());
                quantity++;
                if (quantity <= showProducts.getSize_quantity()) {
                    tvQunatitySetOfSelectedItem.setText(String.valueOf(quantity));
                    showProducts.setQuantity(quantity); // If your model doesn't have this field, create it
                }
            }
        });
    
        minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int quantity = Integer.valueOf(tvQunatitySetOfSelectedItem.getText().toString());
                quantity--;
                if (quantity > 0) {
                    tvQunatitySetOfSelectedItem.setText(String.valueOf(quantity));
                    showProducts.setQuantity(quantity); // If your model doesn't have this field, create it
                }
            }
        });
    
        return view;
    }
    
    public float getTotal() { // You can use int, long or double ... It's up to you
        float result = 0;
        for (ShowProducts showProducts : listShowProducts) {
            result += showProducts.getPrice() * showProducts.getQuantity();
        }
        return result;
    }
    

    那么如果你想计算总价 -> 只需拨打yourAdapter.getTotal()

    【讨论】:

    • 除此之外,您应该将数量保存到列表中或将其添加到您的 ShowProducts 模型中,而不是从 textview 获取文本并对其进行解析。
    • 完全同意@TamásKozmér。
    • 请告诉我如何通过 arrayList 计算。我不知道我是一个新开发者..
    • 谢谢。它工作得很好。但问题就在这里。当我从加号按钮增加数量时,我如何计算?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多