如何在Android中的RecyclerView上添加onClickListener?

如何在Android中的RecyclerView上添加onClickListener?,android,Android,我正在开发一个租车应用程序。当用户点击汽车上的按钮时,他应该被引导到预订页面。我尝试了那里的一切,但当我单击视图/汽车时,我得到以下错误: java.lang.NullPointerException:尝试在空对象引用上调用接口方法'void com.cuboid.rentacabs.ViewAdapter$onClickListener.onClick(int)' 代码中的所有内容在我看来都很好, 这是我的viewAdapter.java public class ViewAdapter ex

我正在开发一个租车应用程序。当用户点击汽车上的按钮时,他应该被引导到预订页面。我尝试了那里的一切,但当我单击视图/汽车时,我得到以下错误:
java.lang.NullPointerException:尝试在空对象引用上调用接口方法'void com.cuboid.rentacabs.ViewAdapter$onClickListener.onClick(int)'

代码中的所有内容在我看来都很好, 这是我的viewAdapter.java

public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.MyViewHolder> {


DatabaseReference ref;
FirebaseDatabase fbRref;
Context context;
ArrayList<Model> model;
private onClickListener mListener;

public ViewAdapter(Context c, ArrayList<Model> listItems, onClickListener onClickListener)
{
    this.context = c;
    this.model = listItems;
    this.mListener = onClickListener;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.car_details, parent, false);
    fbRref = FirebaseDatabase.getInstance();
    ref = fbRref.getReference();
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.carName.setText(model.get(position).getmCarName());
    holder.seatingCapacity.setText(model.get(position).getmSeatingCapacity());
    holder.transmission.setText(model.get(position).getmTransmission());
    holder.fuelType.setText(model.get(position).getmFuelType());
    //holder.rate.setText(model.get(position).getmRate());
}

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

public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
    public TextView carName,seatingCapacity,transmission,fuelType,rate;
    public Button bookBtn;
    public onClickListener onClickListener;

    public MyViewHolder(@NonNull View itemView)
    {
        super(itemView);
        carName = itemView.findViewById(R.id.car_name);
        seatingCapacity = itemView.findViewById(R.id.seating_capacity);
        transmission = itemView.findViewById(R.id.transmission_type);
        fuelType = itemView.findViewById(R.id.fuel_type);
        rate = itemView.findViewById(R.id.rate);
        bookBtn =(Button) itemView.findViewById(R.id.book_btn);

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        onClickListener.onClick(getAdapterPosition());
    }
}

public interface onClickListener
{
    void onClick(int position);
}
公共类ViewAdapter扩展了RecyclerView.Adapter{ 数据库参考文献; FirebaseDatabase fbRref; 语境; ArrayList模型; 私人监听者; 公共ViewAdapter(上下文c、ArrayList listItems、onClickListener和onClickListener) { this.context=c; this.model=列表项; this.mListener=onClickListener; } @非空 @凌驾 public MyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ LayoutFlater充气机=LayoutFlater.from(上下文); 视图=充气机。充气(R.layout.car\u详细信息,父项,false); fbRref=FirebaseDatabase.getInstance(); ref=fbRref.getReference(); 返回新的MyViewHolder(视图); } @凌驾 public void onBindViewHolder(@NonNull MyViewHolder,int位置){ holder.carName.setText(model.get(position.getmCarName()); holder.seatingCapacity.setText(model.get(position.getmSeatingCapacity()); holder.transmission.setText(model.get(position.getmTransmission()); holder.fuelType.setText(model.get(position.getmFuelType()); //holder.rate.setText(model.get(position.getmRate()); } @凌驾 public int getItemCount(){ 返回model.size(); } 公共静态类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener { 公共文本视图carName、座位容量、传输、燃料类型、费率; 公共按钮书; 公共onClickListener onClickListener; 公共MyViewHolder(@NonNull View itemView) { 超级(项目视图); carName=itemView.findviewbyd(R.id.car\u name); 座位容量=itemView.findViewById(R.id.座位容量); 传输=itemView.findViewById(R.id.transmission\U类型); fuelType=itemView.findViewById(R.id.fuel\U类型); rate=itemView.findViewById(R.id.rate); bookBtn=(按钮)itemView.findViewById(R.id.book\u btn); setOnClickListener(这个); } @凌驾 公共void onClick(视图v){ onClickListener.onClick(getAdapterPosition()); } } 公共接口侦听器 { void onClick(内部位置); } }

这是我的家片段:

public class home extends Fragment implements ViewAdapter.onClickListener{
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public home() {
}
// TODO: Rename and change types and number of parameters
public static home newInstance() {
    home fragment = new home();
    Bundle args = new Bundle();
    fragment.setArguments(args);
    return fragment;
}

//to recycler view.
private RecyclerView recyclerView;
public View view;
private ArrayList<Model> listItem;
ViewAdapter Vadapter;
DatabaseReference dbRef;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_home, container,false);
    recyclerView = view.findViewById(R.id.carDetailsContainer);
    listItem = new ArrayList<Model>();
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(layoutManager);
    dbRef = FirebaseDatabase.getInstance().getReference().child("Cars");
    Vadapter = new ViewAdapter(getContext(),listItem,this);
    //recyclerView.OnClickListener();
    return view;
}

@Override
public void onStart() {
    super.onStart();
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren())
            {
                Model model = new Model(ds.child("Name").getValue().toString(),ds.child("Seating_Capacity").getValue().toString(),ds.child("Fuel").getValue().toString(),ds.child("Transmission").getValue().toString(),ds.child("Rate").getValue().toString());
                listItem.add(model);

            }
            recyclerView.setAdapter(Vadapter);
        }


        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };

    dbRef.addValueEventListener(valueEventListener);
}

@Override
public void onClick(int position) {
    listItem.get(position);
    Log.d(TAG, "onClick: item"+ position);
    startActivity(new Intent(getActivity(), booking.class));
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}
公共类home extends片段实现了ViewAdapter.onClickListener{ //TODO:重命名参数参数,选择匹配的名称 //片段初始化参数,例如ARG_ITEM_NUMBER 私有静态最终字符串ARG_PARAM1=“PARAM1”; 私有静态最终字符串ARG_PARAM2=“PARAM2”; //TODO:重命名和更改参数类型 私有字符串mParam1; 私有字符串mParam2; 私有OnFragmentInteractionListener mListener; 公共住宅(){ } //TODO:重命名和更改参数的类型和数量 公共静态home newInstance(){ 主页片段=新主页(); Bundle args=新Bundle(); fragment.setArguments(args); 返回片段; } //到“回收者”视图。 私人回收站; 公众观点; 私有ArrayList列表项; 视窗适配器; 数据库引用dbRef; @凌驾 创建视图上的公共视图(布局、充气机、视图组容器、, Bundle savedInstanceState){ //为该碎片膨胀布局 视图=充气机。充气(R.layout.fragment\u home,container,false); recyclerView=view.findViewById(R.id.carDetailsContainer); listItem=新的ArrayList(); RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(getContext()); recyclerView.setLayoutManager(layoutManager); dbRef=FirebaseDatabase.getInstance().getReference().child(“Cars”); Vadapter=新的ViewAdapter(getContext(),listItem,this); //RecycleView.OnClickListener(); 返回视图; } @凌驾 public void onStart(){ super.onStart(); ValueEventListener ValueEventListener=新的ValueEventListener(){ @凌驾 public void onDataChange(@NonNull DataSnapshot DataSnapshot){ 对于(DataSnapshot ds:DataSnapshot.getChildren()) { 模型模型=新模型(ds.child(“名称”).getValue().toString()、ds.child(“座位容量”).getValue().toString()、ds.child(“燃料”).getValue().toString()、ds.child(“传输”).getValue().toString()、ds.child(“速率”).getValue().toString(); 添加(模型); } recyclerView.setAdapter(Vadapter); } @凌驾 已取消的公共void(@NonNull DatabaseError DatabaseError){ } }; dbRef.addValueEventListener(valueEventListener); } @凌驾 公共void onClick(内部位置){ 获取(位置); Log.d(标记“onClick:item”+位置); startActivity(新意图(getActivity(),booking.class)); } FragmentInteractionListener上的公共接口{ //TODO:更新参数类型和名称 void onFragmentInteraction(Uri); } }

提前谢谢。

你犯了一个小错误。 把这个换掉

 @Override
    public void onClick(View v) {
        onClickListener.onClick(getAdapterPosition());
    }
对此

  @Override
    public void onClick(View v) {
        mListener.onClick(getAdapterPosition());
    }

按如下所示的方式使用它:

 itemView.setOnClickListener(this);

@Override
    public void onClick(View v) {
        if (v.getId() == id of itemView(R.id.itemview)){
        //do not use this
        onClickListener.onClick(getAdapterPosition());
       //just call the function you need to call on Click of itemview
}
    }

希望这有助于

itemView.setOnClickListener(这个)
那行是做什么的?你能告诉我它是怎么做的吗?是的,我不明白为什么
viewholder
类是静态的,而且他使用的是未分配的
onClicklistner
。@Parth是的,我知道了,我不知道是怎么做的