【问题标题】:Context on Adapter for RecyclerViewRecyclerView 适配器上的上下文
【发布时间】:2020-12-05 18:07:21
【问题描述】:

我正在尝试将上下文从我的 java 类发送到我的 RecyclerView 适配器,因此我可以单击元素并被重定向到一个意图。显然,上下文不正确。我已经评论了它的行并且该应用程序可以正常工作,但是一旦我尝试证明它,它就会再次开始崩溃。 我认为这是一个上下文问题,但如果有另一种方法可以为我的元素设置点击方法,那将非常有帮助。

它抛出的异常是空指针异常:

java.lang.RuntimeException:无法启动活动: java.lang.NullPointerException:尝试调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上

这是适配器代码:

public class SubsidioAdapter extends RecyclerView.Adapter<SubsidioAdapter.SubsidioViewHolder> {

    private Context context;
    private List<Producto> productoList;
    private LayoutInflater inflater;

    public SubsidioAdapter(Context context, List<Producto> productoList) {
        this.context = context;
        this.productoList = productoList;
        this.inflater = LayoutInflater.from(context);
    }


    @Override
    public SubsidioViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = this.inflater.inflate(R.layout.producto_item, null);
        return new SubsidioViewHolder(view);
    }

    @Override
    public void onBindViewHolder(SubsidioViewHolder subsidioViewHolder, int position) {
        subsidioViewHolder.imageView.setImageResource(this.productoList.get(position).getFoto());
        subsidioViewHolder.textView1.setText(this.productoList.get(position).getNombre());
        subsidioViewHolder.textView2.setText(this.productoList.get(position).getDescripcion());
        subsidioViewHolder.textView3.setText(this.productoList.get(position).getPrecio());
        subsidioViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                context.startActivity(new
                        Intent(context, ModificarProductoActivity.class));
            }
        });
    }

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

    public class SubsidioViewHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView textView1;
        TextView textView2;
        TextView textView3;

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

            this.imageView = itemView.findViewById(R.id.fotoSub);
            this.textView1 = itemView.findViewById(R.id.descSub);
            this.textView2 = itemView.findViewById(R.id.nombreSub);
            this.textView3 = itemView.findViewById(R.id.precioSub);

        }
    }
}

【问题讨论】:

  • 它是一个空指针异常:java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.proingsoftware/proingsoftware.activities.funcionario.ModificarProductoActivity}:java.lang.NullPointerException:尝试调用空对象引用上的虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”
  • 它不是一个按钮,它是我的回收站视图中的一个元素,在任何被点击的元素上它都应该意图
  • 你的异常是Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference,这意味着你在一个空的Button上设置了一个监听器
  • 但没有声明按钮,我没有在该活动中使用任何按钮:(
  • 崩溃什么时候发生?你怎么做才能撞车?点击 RV 的某个项目?

标签: java android android-recyclerview android-adapter


【解决方案1】:

为适配器项布局的根元素设置一个 id,然后通过 id 找到该视图并使用它而不是 itemView , 而不是:

subsidioViewHolder.itemView.setOnClickListener(new View.OnClickListener(){
        public void onClick(View view) {
          ...
        }
    });

使用:

subsidioViewHolder.rootLayout.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view) {
              ...
            }
        });

。请记住,您可以在 onCreateViewHolder() 内的 recyclerView 适配器中获取上下文,而无需使用如下构造函数:

@Override
public SubsidioViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    context=viewGroup.getContext();
    View view = this.inflater.inflate(R.layout.producto_item, null);
    return new SubsidioViewHolder(view);
}

虽然您的问题似乎出在

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多