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
}