androidlistviewsimpleadapter

Android listview simpleAdapter get the sum of each Row's last column Textview


I have 3 Arrays for Name,Quantity and Price.

I use Listview to display them out with SimpleAdapter. On top of that, I have 2 buttons in each row which are used to control the Quantity - Plus and Minus Quantity.

When clicking on the Plus Or Minus button, the quantity will change and the sub-total of that row will be updated as well.

If quantity = 1, when clicking on the minus button, it will remain 1;

so far all the functions working correctly.

enter image description here

Java

int cal_quantity;

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

List<HashMap<String, String>> aList = new ArrayList<HashMap<String, String>>();

final String name[]={"apple","orange","pear"};
final String quantity[]={"1","2","3"};
final String price[]={"5","10","2"};

for(int i=0;i<name.length;i++){
    HashMap<String, String> map = new HashMap<>();
    map.put("name",name[i]);
    map.put("quantity",quantity[i]);
    map.put("price",price[i]);
    aList.add(map);
}

String[] from = {"name","quantity","price"};
int[] to = {R.id.name,R.id.quantity,R.id.price};

SimpleAdapter adapter = new SimpleAdapter(this, aList, R.layout.main7, from, to){
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        View v = super.getView(position, convertView, parent);
        final TextView tv_quantity=(TextView)v.findViewById(R.id.quantity);
        final TextView tv_price=(TextView)v.findViewById(R.id.price);
        final TextView tv_total=(TextView)v.findViewById(R.id.total);

        final int get_quantity = Integer.parseInt(tv_quantity.getText().toString());
        final double get_price= Double.parseDouble(tv_price.getText().toString());
        final double get_total=get_quantity*get_price;
        tv_total.setText(get_total+"");

        Button minus=(Button)v.findViewById(R.id.minus);
        minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                cal_quantity=Integer.parseInt(tv_quantity.getText().toString());
                if(cal_quantity!=1){
                    cal_quantity=cal_quantity-1;
                }
                tv_quantity.setText(cal_quantity+"");
                double get_total=cal_quantity*get_price;
                tv_total.setText(get_total+"");
            }
        });

        Button plus=(Button)v.findViewById(R.id.plus);
        plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                cal_quantity=Integer.parseInt(tv_quantity.getText().toString());
                cal_quantity=cal_quantity+1;
                tv_quantity.setText(cal_quantity+"");
                double get_total=cal_quantity*get_price;
                tv_total.setText(get_total+"");
            }
        });
        return v;
    }
};

ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

}

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main8"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.yu.singleton.Main8Activity"
android:orientation="vertical">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_weight="0.3"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listview" />
</LinearLayout>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:background="@android:color/holo_blue_dark"
    android:layout_weight="0.7"
    android:layout_height="match_parent">

    <TextView
        android:text="Total"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView3"
        android:textAlignment="center"
        android:textSize="36sp" />
</LinearLayout>
</LinearLayout>

My question is how to Add the sub-total of each Row and then display it in a Textview (Total) below the Listview


Solution

  • You should save the quantity to your data source whenever you plus or minus.
    Here is the way to save the quantity to your data source and calculate total when minus, you should do the same for plus

    minus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            cal_quantity = Integer.parseInt(tv_quantity.getText().toString());
            if (cal_quantity != 1) {
                cal_quantity = cal_quantity - 1;
            }
    
            // Save the quantity to your datasource (aList)
            aList.get(position).put("quantity", "" + cal_quantity);
    
            // Calculate total
            int total = 0;
            Log.d("TAG", "start total = " +total);
            for (int i = 0; i < aList.size(); i++) {
                Log.d("TAG", "at "+i+ " quantity = " +aList.get(i).get("quantity"));
                total += Integer.parseInt(aList.get(i).get("quantity")) * Integer.parseInt(aList.get(i).get("price"));
                Log.d("TAG", "at "+i+ " total = " +total);
            }
            // Display total, currently I use Toast, you can display it into your TextView
            Toast.makeText(getApplicationContext(), "Total " + total, Toast.LENGTH_SHORT).show();
    
            ...
        }
    });