如何在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是的,我知道了,我不知道是怎么做的