繁体   English   中英

我想实现一个回收器视图点击事件

[英]I'd like to implement a recycler view click event

我想实现一个回收器视图点击事件。 我打算在单击 tvRoomNum 时发生事件。 但是在 null object 引用上出现错误“TextView.setOnClickListener(android.view.View$OnClickListener)”。 所以我注意到 tvRoomNum 是 null object 并尝试使用“findViewById”。 但是 function 不被识别。 我该如何解决这个问题?

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

                }
            });

        }
    }
}

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

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

                    }
                }

            });
        }
    }
}

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

function 未被识别,因为您刚刚调用了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);

                }
            });

        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM