0

I've created a recycler view to display data. I want to display a toast message when clicking interview. so, I set this,

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "item clicked!!", Toast.LENGTH_SHORT).show();
            }
        });

in onbindViewHolder method in the adapter class. After run the app app crashed and displayed this error.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ss.newapp, PID: 27382
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.widget.Toast.<init>(Toast.java:178)
        at android.widget.Toast.makeText(Toast.java:595)
        at android.widget.Toast.makeText(Toast.java:583)
        at com.ss.newapp.DetailsAdapter$1.onClick(DetailsAdapter.java:50)
        at android.view.View.performClick(View.java:7509)
        at android.view.View.performClickInternal(View.java:7486)
        at android.view.View.access$3600(View.java:841)
        at android.view.View$PerformClick.run(View.java:28709)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:236)
        at android.app.ActivityThread.main(ActivityThread.java:8061)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
D/OOMEventManagerFK: checkEventAndDumpForJE: 0
I/Process: Sending signal. PID: 27382 SIG: 9
Disconnected from the target VM, address: 'localhost:53359', transport: 'socket'

I checked other solutions reguarding to this error in SO, but it didn't work for my code.

Here is my Adapter.java class

public class DetailsAdapter extends
        RecyclerView.Adapter<DetailsAdapter.ViewHolder> {

    private List<Details> detailsList;
    Context context;
   
    public DetailsAdapter(List<Details> detailsList, Context context){

        this.detailsList = detailsList;
        this.context = context;
    }

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

    @Override
    public void onBindViewHolder(@NonNull DetailsAdapter.ViewHolder holder,
                                 int position) {
        holder.txtCusCode.setText(detailsList.get(position).getCode());
        holder.txtCusName.setText(detailsList.get(position).getName());
       
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "item clicked!!", Toast.LENGTH_SHORT).show();
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        TextView txtCusName, txtCusCode;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            txtCusCode = itemView.findViewById(R.id.cusCodeTxt);
            txtCusName = itemView.findViewById(R.id.cusNameTxt);
        }
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Context context;
    TextView textView;
    RecyclerView recyclerView;
    LinearLayoutManager layoutManager;
    DetailsAdapter detailsAdapter;
    List<Details> detailsList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        recyclerView = findViewById(R.id.recyclerview);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        detailsAdapter = new DetailsAdapter(detailsList, context);
        recyclerView.setAdapter(detailsAdapter);

        context = getApplicationContext();

        getDetails();
    }

    private void getDetails() {
    }

1 Answers1

2

You have get data first and then set adapter(copy this and try)

public class MainActivity extends AppCompatActivity {

    Context context;
    TextView textView;
    RecyclerView recyclerView;
    LinearLayoutManager layoutManager;
    DetailsAdapter detailsAdapter;
    List<Details> detailsList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplicationContext();
        getDetails();
        textView = findViewById(R.id.textView);
        recyclerView = findViewById(R.id.recyclerview);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        detailsAdapter = new DetailsAdapter(detailsList, context);
        recyclerView.setAdapter(detailsAdapter);

        

        
    }

    private void getDetails() {

        RetrofitClient.getRetrofitClient().getDetails().enqueue(new Callback<List<Details>>() {
            @Override
            public void onResponse(Call<List<Details>> call, Response<List<Details>> response) {
                if(response.isSuccessful() && response.body() != null){

                    detailsList.addAll(response.body());
                    detailsAdapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onFailure(Call<List<Details>> call, Throwable t) {
                textView.setText((t.getMessage()));
            }
        });
    }
Jens
  • 67,715
  • 15
  • 98
  • 113
Dhruv Sakariya
  • 792
  • 4
  • 10