【问题标题】:How to fix "NullPointerException" on ViewHolder?如何修复 ViewHolder 上的“NullPointerException”?
【发布时间】:2019-05-17 11:56:45
【问题描述】:

我正在尝试做可点击的RecyclerView,我看了tutorial 上的操作方法,但是当我点击RecyclerView 时,它给了我界面NullPointerException

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

是不是和界面有关?我是否需要像this one 建议的那样将接口传递给适配器?

这是个例外

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

【问题讨论】:

标签: java android android-recyclerview nullpointerexception


【解决方案1】:

很可能您没有使用 listener 属性初始化 ViewHolder 类。使用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;

我建议您查看my answer here,以便更好地了解如何在您的RecyclerView 中实现点击监听。

【讨论】:

  • 我试过你的答案,但它给了我另一个例外。我从 logcat 中了解到有两个项目单击。一个来自 ViewHolder,另一个在适配器中
  • java.lang.RuntimeException:来自系统的失败...等...在 com.example.jobseeker.MainHomeFragment.JobListFragment$2$1.onItemClick(JobListFragment.java:157) 在 com.example。 jobseeker.ViewHolder$1.onClick(ViewHolder.java:32)
  • 您是否检查了我提供链接的答案?
  • 我做到了。我刚刚重新做了适配器,现在它可以工作了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 2020-04-23
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多