Search code examples
javaandroidbuttonadapteronclicklistener

Listview button click listener is not working


I'm using an adapter class to set values for my items. For each item there is a + and a - button. I have a foodActivity java class, activity_food layout for the java class and a list_view_layout for the lists. I have initialized the + and - buttons inside my activity class. When the activity_food starts, the app crashes.

This is my item list image

plus, minus and edittext in list_view_layout -

<Button
    android:id="@+id/minus"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_below="@+id/foodname"
    android:layout_toEndOf="@+id/foodpic"
    android:text="-"
    android:textSize="12sp" />

<EditText
    android:id="@+id/quantity"
    android:layout_width="25dp"
    android:layout_height="30dp"
    android:layout_below="@+id/foodname"
    android:layout_toEndOf="@+id/minus"
    android:ems="10"
    android:inputType="number"
    android:textAlignment="center"
    android:background="@drawable/edittextbackground"
    android:text="0" />

<Button
    android:id="@+id/plus"
    android:layout_width="35dp"
    android:layout_height="35dp"
    android:layout_alignTop="@+id/quantity"
    android:layout_toEndOf="@+id/quantity"
    android:text="+"
    android:textSize="12sp" />

activity_food layout -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.res.easyorder.foodActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:divider="#ffff"
        android:dividerHeight="5dp"/>
</RelativeLayout>

My adapter class -

package com.res.easyorder;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.zip.Inflater;

public class MyAdapter extends ArrayAdapter<item> {

    int q_ty = 0;
    ArrayList<item> foodlist = new ArrayList<>();

    public MyAdapter(Context context, int textViewResourceId, ArrayList<item> objects){

        super(context, textViewResourceId, objects);
        foodlist = objects;
    }

    @Override
    public int getCount(){

        return super.getCount();
    }

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

        View v = convertView;
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.list_view_layout, null);

        ImageView foodpic = (ImageView) v.findViewById(R.id.foodpic);
        TextView foodname = (TextView) v.findViewById(R.id.foodname);
        TextView foodprice = (TextView) v.findViewById(R.id.foodprice);
        Button plus = (Button) v.findViewById(R.id.plus);
        final EditText quantity = (EditText) v.findViewById(R.id.quantity);
        Button minus = (Button) v.findViewById(R.id.minus);

        plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                item item = getItem(position);
                q_ty = Integer.parseInt(item.getQuantity());
                q_ty = q_ty + 1;
                quantity.setText("" +q_ty);
            }
        });


        foodname.setText(foodlist.get(position).getFoodName());
        foodpic.setImageResource(foodlist.get(position).getFoodImage());
        foodprice.setText("BDT: " +foodlist.get(position).getFoodPrice());
        quantity.setText(foodlist.get(position).getQuantity());

        return v;
    }
}

foodActivity java code. Plus minus onclicklistener is being commented -

package com.res.easyorder;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;

import java.util.ArrayList;

public class foodActivity extends AppCompatActivity {

    private String type = null;
    int quantity = 0;

    private Button plus, minus;
    private EditText q_ty;

    ListView simplelist;
    ArrayList<item> foodlist = new ArrayList<>();
    private FirebaseAuth firebaseAuth;

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

        firebaseAuth = FirebaseAuth.getInstance();
        simplelist = (ListView) findViewById(R.id.listview);

        plus = (Button) findViewById(R.id.plus);
        minus = (Button) findViewById(R.id.minus);
        q_ty = (EditText) findViewById(R.id.quantity);

        type = getIntent().getExtras().getString("type");

        if(type.equals("breakfast"))
        {
            foodlist.add(new item("Rooti",R.drawable.ruti,5));
            foodlist.add(new item("Parata",R.drawable.porata,8));
            foodlist.add(new item("Tandoor",R.drawable.tandoor,15));
            foodlist.add(new item("Vegetable",R.drawable.sodji,10));
            foodlist.add(new item("Daal",R.drawable.dal,10));
            foodlist.add(new item("Omelet",R.drawable.dimvaji,15));
            foodlist.add(new item("Singara",R.drawable.singara,8));
            foodlist.add(new item("Samosa",R.drawable.samosa,10));
            foodlist.add(new item("Puri",R.drawable.puri,5));

        }
        

        MyAdapter myAdapter = new MyAdapter(this,R.layout.list_view_layout,foodlist);
        simplelist.setAdapter(myAdapter);

        /*plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //quantity = quantity + 1;
                //q_ty.setText(""+quantity);
            }
        });

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

                if (quantity==0)
                {
                    //q_ty.setText(""+quantity);
                }

                else if (quantity>0)
                {
                    quantity = quantity - 1;
                    //q_ty.setText(""+quantity);
                }
            }
        });*/
    }

   
}


Solution

  • You are facing this problem because you have plus minus button on Listview item row xml file and you are finding plus minus button in activity. You have to put your click listener in your adapter class

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        ViewHolder holder;
    
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_entry, null);
            holder = new ViewHolder();
            holder.quantity= (EditText) convertView.findViewById(R.id.quantity);
            holder.plus = (Button) convertView.findViewById(R.id.plus);
            holder.minus = (Button) convertView.findViewById(R.id.minus);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
    
        Item item = getItem(position);
    
        holder.quantity.setText(item.getQuantity());
    
        holder.plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
    
            Item item = getItem(position); 
            q_ty = Integer.parseInt(item.getQuantity()); 
            q_ty = q_ty + 1; 
            quantity.setText("" +q_ty);
            item.setQuantity(q_ty);
            }
        });
    
    
    
        return convertView;
    }