0

I'm trying to do the clickable RecyclerView, I watched a tutorial on how to do it, but it gave me interface NullPointerException when I click the RecyclerView.

public class ViewHolder extends RecyclerView.ViewHolder {

    View mView;
    private ViewHolder.ClickListener mClickListener;

    public interface ClickListener{
        void onItemClick(View view, int position);
    }

    public void setOnClickListener(ViewHolder.ClickListener clickListener){
        mClickListener = clickListener;
    }

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

        mView = itemView;

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mClickListener.onItemClick(v, getAdapterPosition()); //Line that called the Exception
            }
        });
    }
}

Is it something that has to do with the interface? Do I need to pass the interface to adapter like this one suggests?

Here's the exception

java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.jobseeker.ViewHolder$ClickListener.onItemClick(android.view.View, int)' on a null object reference
        at com.example.jobseeker.ViewHolder$1.onClick(ViewHolder.java:32)
...etc.

Here's the adapter

adapter = new FirebaseRecyclerAdapter<Model, ViewHolder>(options) {
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull final ViewGroup viewGroup, int i) {
        final View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.row, viewGroup, false);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView mCompNameTv = view.findViewById(R.id.rCompNameTv);
                TextView mDescTv = view.findViewById(R.id.rDescTv);
                TextView mPosTv = view.findViewById(R.id.rPosTv);
                ImageView mImageTv = view.findViewById(R.id.rImageIv);

                String mCompName = mCompNameTv.getText().toString();
                String mDesc = mDescTv.getText().toString();
                String mPos = mPosTv.getText().toString();
                Drawable mDrawable = mImageTv.getDrawable();
                Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap();

                Intent intent = new Intent(viewGroup.getContext(), DetailActivity.class);
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                mBitmap.compress(Bitmap.CompressFormat.PNG, 80, stream);
                byte[] bytes = stream.toByteArray();
                intent.putExtra("image", bytes);
                intent.putExtra("companyName", mCompName);
                intent.putExtra("description", mDesc);
                intent.putExtra("position", mPos);
                startActivity(intent);
            }
        });

        return new ViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Model model) {
        holder.setDetails(model.getCompanyName(), model.getDescription(), model.getPosition(), model.getImage());
    }

    @Override
    public int getItemCount() {
        return super.getItemCount();
    }
};
ADM
  • 20,406
  • 11
  • 52
  • 83
  • You're not initializing `mClickListener` in any of the code you provided, which would be why you're getting an NPE – Dan 0 May 17 '19 at 00:37
  • Possible duplicate of [What is a NullPointerException, and how do I fix it?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – ADM May 17 '19 at 03:56
  • have you create Interface class ? – Sandeep Malik May 17 '19 at 06:40

1 Answers1

0

Most likely you have not initialized your ViewHolder class with the listener attribute. Use the setOnClickListener function to initialize the ViewHolder.

Hence your return statement from onCreateViewHolder might look like the following.

ViewHolder vh = new ViewHolder(view);
vh.setOnClickListener(clickListener); // Initialize a click listener in your Activity maybe and pass it here.
return vh;

I would like to suggest checking my answer here for a better understanding of how you can achieve the click listening in your RecyclerView.

Reaz Murshed
  • 23,691
  • 13
  • 78
  • 98
  • I tried your answer but it gave me another exception. What i understand from the logcat there is two item click. The one from ViewHolder and another one in the adapter – Adhityo Putro May 17 '19 at 08:06
  • java.lang.RuntimeException: Failure from system...etc...at com.example.jobseeker.MainHomeFragment.JobListFragment$2$1.onItemClick(JobListFragment.java:157) at com.example.jobseeker.ViewHolder$1.onClick(ViewHolder.java:32) – Adhityo Putro May 17 '19 at 08:07
  • Did you check my answer that I provided a link to? – Reaz Murshed May 17 '19 at 16:44
  • I did. I just re-did the adapter and now it works. Thanks – Adhityo Putro May 17 '19 at 17:44