Как исправить «NullPointerException» на ViewHolder? - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь сделать кликабельный RecyclerView, я смотрел учебник о том, как это сделать, но он дал мне интерфейс NullPointerException, когда я нажимал 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
            }
        });
    }
}

Это как-то связано с интерфейсом?Нужно ли передавать интерфейс адаптеру, как этот предлагает?

Вот исключение

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.

Вот адаптер

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();
    }
};

1 Ответ

0 голосов
/ 17 мая 2019

Скорее всего, вы не инициализировали свой класс ViewHolder с атрибутом listener.Используйте функцию setOnClickListener для инициализации ViewHolder.

Следовательно, ваш оператор возврата из onCreateViewHolder может выглядеть следующим образом.

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

Я хотел бы предложить проверить мой ответ здесь для лучшего понимания того, как вы можете добиться прослушивания щелчка в вашем RecyclerView.

...