Otototo
Otototo

Reputation: 23

Recyclerview adapter with buttons didn't work

I want to create recycleview with 2 buttons. I have declared buttons in adapter, but I get an error:

"java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference".

This is my adapter.java:

public class ProductListAdapter extends RecyclerView.Adapter<ProductListAdapter.ProductViewHolder> {
private OnItemClickListener mListener;

public interface OnItemClickListener{
    void onAddClick(int position);
    void onEditClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

private Context context;
private ArrayList product_name, product_id, product_kcl, product_fat, product_carbo, product_sugar, product_proteins, product_salt;

public static class ProductViewHolder extends RecyclerView.ViewHolder {
    TextView product_name_txt;
    public Button edit_button;
    public Button add_to_meal_button;

    public ProductViewHolder(View itemView, final OnItemClickListener listener) {
        super(itemView);
        product_name_txt = itemView.findViewById(R.id.item_name_txt);
        edit_button = itemView.findViewById(R.id.edit_button);
        add_to_meal_button = itemView.findViewById(R.id.add_meal_button);

        add_to_meal_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION){
                        listener.onAddClick(position);
                    }
                }

            }
        });
        edit_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION){
                        listener.onEditClick(position);
                    }
                }
            }
        });
    }
}
public ProductListAdapter(Context context, ArrayList product_id, ArrayList product_name, ArrayList product_kcl, ArrayList product_fat, ArrayList product_carbo, ArrayList product_sugar, ArrayList product_proteins, ArrayList product_salt) {
    this.context = context;
    this.product_name = product_name;
    this.product_id = product_id;
    this.product_kcl = product_kcl;
    this.product_fat = product_fat;
    this.product_carbo = product_carbo;
    this.product_sugar = product_sugar;
    this.product_proteins = product_proteins;
    this.product_salt = product_salt;
}
@Override
public ProductListAdapter.ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.product_item, parent, false);
    return new ProductViewHolder(view, mListener);
}

@Override
public void onBindViewHolder(ProductViewHolder holder, final int position) {
    holder.product_name_txt.setText(String.valueOf(product_name.get(position)));
}

@Override
public int getItemCount() {
    return product_id.size();
}

}

This is my item:

<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/item_layout">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp">

            <TextView
                android:id="@+id/item_name_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="40dp"
                android:layout_marginLeft="40dp"
                android:layout_marginTop="2dp"
                android:layout_marginBottom="2dp"
                android:text="Nazwa"
                android:textSize="30dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Button
                android:id="@+id/edit_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="2dp"
                android:layout_marginEnd="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginBottom="2dp"
                android:layout_toStartOf="@+id/add_to_meal_button"
                android:layout_toLeftOf="@+id/add_to_meal_button"
                android:text="Edytuj" />

            <Button
                android:id="@+id/add_to_meal_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_marginTop="2dp"
                android:layout_marginEnd="20dp"
                android:layout_marginRight="20dp"
                android:layout_marginBottom="2dp"
                android:text="Dodaj" />

        </RelativeLayout>
</androidx.cardview.widget.CardView>

Upvotes: 1

Views: 66

Answers (2)

Mohsen Naderzadeh
Mohsen Naderzadeh

Reputation: 61

The id of Dodaj Button is add_to_meal_button, not add_meal_button.

I had some refactoring on your java code, too:

public class ProductListAdapter extends RecyclerView.Adapter<ProductListAdapter.ProductViewHolder> {
private static OnItemClickListener mListener;
private Context context;
private ArrayList product_name, product_id, product_kcl, product_fat, product_carbo, product_sugar, product_proteins, product_salt;



public ProductListAdapter(Context context, ArrayList product_id, ArrayList product_name, ArrayList product_kcl, ArrayList product_fat, ArrayList product_carbo, ArrayList product_sugar, ArrayList product_proteins, ArrayList product_salt) {
    this.context = context;
    this.product_name = product_name;
    this.product_id = product_id;
    this.product_kcl = product_kcl;
    this.product_fat = product_fat;
    this.product_carbo = product_carbo;
    this.product_sugar = product_sugar;
    this.product_proteins = product_proteins;
    this.product_salt = product_salt;
}
@Override
public ProductListAdapter.ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
     View view = inflater.inflate(R.layout.product_item, parent, false);
    return new ProductViewHolder(view);
}

@Override
public void onBindViewHolder(final ProductViewHolder holder, final int position) {
    holder.product_name_txt.setText(String.valueOf(product_name.get(position)));
    holder.add_to_meal_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null){
                int position = holder.getAdapterPosition();
                if (position != RecyclerView.NO_POSITION){
                    mListener.onAddClick(position);
                }
            }

        }
    });
    holder. edit_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null){
                int position = holder.getAdapterPosition();
                if (position != RecyclerView.NO_POSITION){
                    mListener.onEditClick(position);
                }
            }
        }
    });
    
}

@Override
public int getItemCount() {
    return product_id.size();
}
public interface OnItemClickListener{
    void onAddClick(int position);
    void onEditClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

public static class ProductViewHolder extends RecyclerView.ViewHolder {
    TextView product_name_txt;
    public Button edit_button;
    public Button add_to_meal_button;

    public ProductViewHolder(View itemView) {
        super(itemView);
        product_name_txt = itemView.findViewById(R.id.item_name_txt);
        edit_button = itemView.findViewById(R.id.edit_button);
        add_to_meal_button = itemView.findViewById(R.id.add_to_meal_button);
    }
       
       
    
}

}

Upvotes: 0

Zain
Zain

Reputation: 40830

You get NPE on add_to_meal_button = itemView.findViewById(R.id.add_meal_button); as add_meal_button id is not included in your layout

To solve this, change the id of your item layout button from add_to_meal_button to add_meal_button

Upvotes: 1

Related Questions