0

I am newbie to android. Please help me with this query,

Aim :

I have a RecyclerView in which there are many cards. I want to go to new activity when I click on card.

The Problem is: Why the null object reference is passed when someone clicks on card?

I found that the problem is in method called onClick inside ViewHolder class :

public void onClick(View v) {
            onCardviewButtonListener.performActionOnPosition(v,list.get(getAdapterPosition()));
        }

My error :

FATAL EXCEPTION: main Process: com.example.todoapp, PID: 14053 java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.todoapp.CustomAdapterForInProgress$OnCardviewButtonListener.performActionOnPosition(android.view.View, com.example.todoapp.seeAllTaskCardDatatype)' on a null object reference at com.example.todoapp.CustomAdapterForInProgress$CustomViewHolder.onClick(CustomAdapterForInProgress.java:41) at android.view.View.performClick(View.java:6733) at android.view.View.performClickInternal(View.java:6691) at android.view.View.access$3400(View.java:802) at android.view.View$PerformClick.run(View.java:26499) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:226) at android.app.ActivityThread.main(ActivityThread.java:7178) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)

CustomAdapter.java file :

package com.example.todoapp;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class CustomAdapterForInProgress extends RecyclerView.Adapter<CustomAdapterForInProgress.CustomViewHolder> {

    static  ArrayList<seeAllTaskCardDatatype> list;
    Context context;
    OnCardviewButtonListener onCardviewButtonListener;
    CustomAdapterForInProgress(ArrayList<seeAllTaskCardDatatype> passedList,Context passedContext,OnCardviewButtonListener onCardviewButtonListener){
        list = passedList;
        context = passedContext;
        this.onCardviewButtonListener = onCardviewButtonListener;
    }

    public interface OnCardviewButtonListener{
        void performActionOnPosition(View v,seeAllTaskCardDatatype obj);
    }

    public static class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView textView;
        private Button button;
        OnCardviewButtonListener onCardviewButtonListener;
        public CustomViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.taskInProgress);
            button = itemView.findViewById(R.id.moveToCompletedTask);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onCardviewButtonListener.performActionOnPosition(v,list.get(getAdapterPosition()));
        }
    }



    @NonNull
    @Override
    public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_for_in_progress,parent,false);
        CustomViewHolder customViewHolder = new CustomViewHolder(view);
        return customViewHolder;

    }

    @Override
    public void onBindViewHolder(@NonNull CustomViewHolder holder, int position){
           seeAllTaskCardDatatype obj = list.get(position);
           holder.textView.setText(obj.getText());

    }



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

}

File implementing CustomAdapter :

package com.example.todoapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;

public class InProgress extends AppCompatActivity {
    DatabaseHelperForInProgress inDb;
    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    CustomAdapterForInProgress.OnCardviewButtonListener onCardviewButtonListener;
    RecyclerView.LayoutManager layoutManager;
    ArrayList<seeAllTaskCardDatatype> inProgressList;
    Context context;
    Cursor cursor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_in_progress);
        context = getApplicationContext();
        inDb = new DatabaseHelperForInProgress(this);

        cursor = inDb.getAllData();

        if(cursor.getCount() > 0  ){


            String[] id =  new String[cursor.getCount()];
            String[] tasks = new String[cursor.getCount()];
            int row =0;
            int column = 0;
            while(cursor.moveToNext()){

                for(int i=0;i<cursor.getColumnCount();i++){
                    if(i == 0){
                        id[row] = cursor.getString(i);
                    }
                    if(i == 1){
                        tasks[column] = cursor.getString(i);
                    }

                }
                row++;
                column++;
            }



            inProgressList = new ArrayList<>();
            for(int j=0;j<cursor.getCount();j++){
                inProgressList.add(new seeAllTaskCardDatatype(tasks[j],id[j]));
            }

            onCardviewButtonListener = new CustomAdapterForInProgress.OnCardviewButtonListener() {
                @Override
                public void performActionOnPosition(View v, seeAllTaskCardDatatype obj) {
                    Intent intent = new Intent(getApplicationContext(),CompletedTasks.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            };

            recyclerView = findViewById(R.id.inProgressRecycler);
            recyclerView.setHasFixedSize(true);
            layoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);
            adapter = new CustomAdapterForInProgress(inProgressList,context,onCardviewButtonListener);
            recyclerView.setAdapter(adapter);
        }else{
            Toast.makeText(this,"No Task is in Progress",Toast.LENGTH_LONG).show();
        }






    }//onCreate Ends


}
  • You are having this OnCardviewButtonListener listener variable inside the ViewHolder. But you failed to initialize it. To make it work remove the listener from ViewHolder and use CustomAdapterForInProgress adapter class listener. – Vishwa Mar 12 '21 at 07:51
  • Thanks Vishwa, There was an error because of initializing the OnCardviewButtonListener reference two times. – Abhishek Singh Mar 13 '21 at 05:54

0 Answers0