如何从自定义列表视图的文本视图中获取所有值

问题描述:

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

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)  

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

定义适配器

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

enter image description here

这是我的列表中查看其显示值当我得到的价值,但看的arror

我调试应用程序

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

我猜你有你的适配器什么包含的数据列表或数组。你为什么不通过迭代来计算总和?你能分享适配器代码吗? –

您没有在tvprice和qua中设置任何价格tvquantity textView中的实体。因此一个空值。

+0

但在我的列表视图中显示了价格和数量。 –

ListView加载数据从您的ArrayList<ShowProducts> arrayList

如果您的视图更新,请更新您的模型内部arrayList了。

然后,您想获得所有产品的总价值,只需通过计算您的arrayList即可完成。请勿触摸View

首先,确保您的型号包含2个字段:quantityprice。 其次,定义里面你Adapter

@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; 
} 

然后2种方法,如果你要计算总价 - >只需拨打yourAdapter.getTotal()

+0

除此之外,您应该将数量保存到List中或将其添加到ShowProducts模型中,而不是从textview中获取文本并解析它。 –

+0

完全同意@TamásKozmér。 –

+0

请告诉我如何通过arrayList来计算。我不知道我是一个新的开发人员.. –

既然你不添加任何价值inyour ArrayList的,这就是为什么你得到空指针异常 首先调用下面的函数来在你的数组列表中添加元素。那么你将能够得到总价。

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; 
} 
+0

arrayList =(ArrayList )getIntent()。getSerializableExtra(“selectedList”); –

+0

我的数组列表有值。因为我的列表视图显示结果。所有的价格和数量已显示,但没有获得tottal –

+0

这些行中的哪一行是行号88.View view = listView.getChildAt(i); TextView tvprice =(TextView)view.findViewById(R.id.tvSetPriceOfSeletedItem); TextView tvquantity =(TextView)view.findViewById(R.id.tvQunatitySetOfSelectedItem); –