0

我想实现一个回收器视图点击事件。当我点击 tvRoomNum 时,我打算举办一个活动。但是出现空对象引用上的错误“TextView.setOnClickListener(android.view.View$OnClickListener)”。所以我注意到 tvRoomNum 是空对象并尝试使用“findViewById”。但无法识别该功能。我该如何解决这个问题?

public class RoomAdapter extends RecyclerView.Adapter<RoomAdapter.CustomViewHolder> {
    private Context context;
    private ArrayList<RoomData> rooms;
    public ArrayList<StudnetInRoomData> students;
    private LayoutInflater inflater;
    private RoomData room;
    View view;

    public RoomAdapter(Context context, ArrayList<RoomData> rooms) {
        this.context = context;
        this.rooms = rooms;
        this.inflater = LayoutInflater.from(context);
        students = new ArrayList<>();
    }

    @Override
    public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        view = inflater.inflate(R.layout.single_room, parent, false);
        return new CustomViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
        room = rooms.get(position);
        holder.tvRoomNum.setText(String.valueOf(room.roomNum));
    }


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


    public class CustomViewHolder extends RecyclerView.ViewHolder {
        public TextView tvRoomNum;

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

            tvRoomNum.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(view.getContext(), PlusStudentActivity.class);
                    intent.putExtra("studentList", room.students);
                    context.startActivity(intent);

                }
            });

        }
    }
}

下面的代码是实现recycler view的recycler view的适配器。这是一个双循环视图结构。

public class FloorAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements OnFloorItemClickListener {

    OnFloorItemClickListener listener;
    static public ArrayList<FloorData> floors;
    private Context context;
    private LayoutInflater layoutInflater;
    private OnItemClickListener mListener = null;

    public FloorAdapter(ArrayList<FloorData> floors, Context context) {
        this.floors = floors;
        this.context = context;
        this.layoutInflater = LayoutInflater.from(context);
    }

    public interface OnItemClickListener{
        void onItemClick(View v, int pos);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mListener = listener ;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = layoutInflater.inflate(R.layout.signle_floor, parent, false);
        return new GridViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((GridViewHolder)holder).recyclerView.setAdapter(new RoomAdapter(context, floors.get(position).rooms));
        ((GridViewHolder)holder).recyclerView.setLayoutManager(new GridLayoutManager(context, 5));
        ((GridViewHolder)holder).recyclerView.setHasFixedSize(true);
        ((GridViewHolder)holder).tvFloorNum.setText(String.valueOf(floors.get(position).floorNum));
    }

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

    @Override public void onItemClick(RecyclerView.ViewHolder holder, View view, int position) {
        if(listener != null){
            listener.onItemClick(holder,view,position);
        }
    }

    @Override
    public int getItemViewType(int position) {
        return floors.get(position).id;
    }

    public class GridViewHolder extends RecyclerView.ViewHolder {
        RecyclerView recyclerView;
        TextView tvFloorNum;
        Button btnPlusRoom;

        public GridViewHolder(View itemView) {
            super(itemView);
            recyclerView = itemView.findViewById(R.id.rvRooms);
            tvFloorNum = itemView.findViewById(R.id.tvFloorNum);
            btnPlusRoom = (Button)itemView.findViewById(R.id.btnPlusRoom);
            btnPlusRoom.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v)
                {
                    int pos = getAdapterPosition();
                    if (pos != RecyclerView.NO_POSITION)
                    {
                        if(mListener != null){
                            mListener.onItemClick(v, pos);
                        }

                    }
                }

            });
        }
    }
}
4

1 回答 1

1

您的 TextView 为空,因为您缺少findViewById():
Id在 a 上找到了View,在这种情况下,它是itemView

该函数未被识别,因为您刚刚调用findViewById()&ViewHolder没有该方法,
您应该调用它itemView.findViewById()

尝试这个:

public class CustomViewHolder extends RecyclerView.ViewHolder {
        public TextView tvRoomNum;

        public CustomViewHolder(View itemView) {
            super(itemView);
            tvRoomNum = itemView.findViewById(R.id.your_textview_id) // THIS
            tvRoomNum.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(view.getContext(), PlusStudentActivity.class);
                    intent.putExtra("studentList", room.students);
                    context.startActivity(intent);

                }
            });

        }
    }
于 2020-12-27T06:46:31.223 回答