Reputation: 23
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
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
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