-2

So I've set up my RecyclerView with API and it's populating the list on the adapter but every time I click on the list item it should open the new activity and pass position through an interface.

The click gives me NullPointerException:

public class ticketsListAdapter extends RecyclerView.Adapter<ticketsListAdapter.ViewHolder>{
onclicklistner listners;
Context context;

public ticketsListAdapter(Context context, onclicklistner listners) {
    this.context = context;
    this.listners = listners;
}

@NonNull
@Override
public ticketsListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.list_support_tickets,parent, false);
    return new ViewHolder(view, listners);
}

@Override
public void onBindViewHolder(@NonNull ticketsListAdapter.ViewHolder holder, int position) {
    holder.item_name.setText("hello");
}

@Override
public int getItemCount() {
    return 5;
}


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

    TextView item_name;
    public ViewHolder(@NonNull View itemView, onclicklistner listner) {
        super(itemView);
        item_name = itemView.findViewById(R.id.tickets_name);
        item_name.setOnClickListener(this::onClick);
    }


    @Override
    public void onClick(View v) {
        listners.onItemClick(getAdapterPosition(), item_name);
    }
}

public interface onclicklistner{
    void onItemClick(int position, View v);
}

}

Log cat & Debug output:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.kalyani.aura, PID: 21421
java.lang.NullPointerException: Attempt to invoke interface method 'void com.kalyani.aura.adapters.ticketsListAdapter$onclicklistner.onItemClick(int, android.view.View)' on a null object reference
    at com.kalyani.aura.adapters.ticketsListAdapter$ViewHolder.onClick(ticketsListAdapter.java:60)
    at com.kalyani.aura.adapters.-$$Lambda$hRD_GBr-hvL2HaQtFW31sqkj_0o.onClick(Unknown Source:2)
    at android.view.View.performClick(View.java:7125)
    at android.view.View.performClickInternal(View.java:7102)
    at android.view.View.access$3500(View.java:801)
    at android.view.View$PerformClick.run(View.java:27336)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Fragment Where Recycler view Implemented

public class support_fragment extends Fragment {

FloatingActionButton create_support;
ticketsListAdapter.onclicklistner listner;
RecyclerView recyclerView;
ticketsListAdapter ticketsListAdapter;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_support, container, false);

    create_support = view.findViewById(R.id.create_support);
    recyclerView = view.findViewById(R.id.support_recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setHasFixedSize(false);
    ticketsListAdapter = new ticketsListAdapter(getContext(), listner);
    recyclerView.setAdapter(ticketsListAdapter);

    create_support.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(getContext(), Support_main_activity.class);
            startActivity(i);
        }
    });

    listner = new ticketsListAdapter.onclicklistner() {
        @Override
        public void onItemClick(int position, View v) {
            Toast.makeText(getContext(), "Test", Toast.LENGTH_SHORT).show();
        }
    };

    return view;
}

}

a_local_nobody
  • 7,947
  • 5
  • 29
  • 51

1 Answers1

0

You are using the listener before initialization. This is why you are getting nullpointerexception.

public class support_fragment extends Fragment {

FloatingActionButton create_support;
ticketsListAdapter.onclicklistner listner;
RecyclerView recyclerView;
ticketsListAdapter ticketsListAdapter;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_support, container, false);

    create_support = view.findViewById(R.id.create_support);
    recyclerView = view.findViewById(R.id.support_recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setHasFixedSize(false);
    
    //initialize the listner before using!
    listner = new ticketsListAdapter.onclicklistner() {
        @Override
        public void onItemClick(int position, View v) {
            Toast.makeText(getContext(), "Test", Toast.LENGTH_SHORT).show();
        }
    };

    
    ticketsListAdapter = new ticketsListAdapter(getContext(), listner);
    recyclerView.setAdapter(ticketsListAdapter);

    create_support.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(getContext(), Support_main_activity.class);
            startActivity(i);
        }
    });
    /*
    listner = new ticketsListAdapter.onclicklistner() {
        @Override
        public void onItemClick(int position, View v) {
            Toast.makeText(getContext(), "Test", Toast.LENGTH_SHORT).show();
        }
    };
    */
    return view;
 }
}
Dharmesh G
  • 67
  • 1
  • 5