单击行时未触发 RecyclerView 单击侦听器

RecyclerView click listener not triggered on row click

编辑 似乎我的 onMentorClick(Mentor mentor) 的 @Override 从未被访问过。

我有一个显示人员列表的回收站视图。 我需要能够单击列表中的其中一个人并打开一个新的 activity。

在我的适配器中,我有以下代码:

private OnMentorClickListener listener;

public interface OnMentorClickListener {
        void onMentorClick(Mentor mentor);
    }

public void setOnMentorClickListener(OnMentorClickListener listener){
        this.listener = listener;
    }

在我的 activity 中,我有以下代码:

mentorAdapter.setOnMentorClickListener(new MentorAdapter.OnMentorClickListener(){
            @Override
            public void onMentorClick(Mentor mentor) {
                Intent intent = new Intent(MentorActivity.this, MentorAddEditActivity.class);

                intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_ID, mentor.getMentor_id());
                intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_NAME, mentor.getMentor_name());
                intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_PHONE, mentor.getMentor_phone());
                intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_EMAIL, mentor.getMentor_email());

                startActivityForResult(intent, EDIT_MENTOR_REQUEST);
            }
        });

我已经以完全相同的方式为我的应用程序的其他部分实现了侦听器,它们都可以正常工作。 我搜索了我的代码,这个设置似乎与代码的其他部分相同。

我没有收到任何错误,但是当我在我的 "Mentors" 页面上列出所有导师时,当我点击一个时没有任何反应。 没有错误,没有崩溃,什么都没有。

我还尝试将 OnMentorClickListener 海峡实施到 Activity class 中,如下所示:

public class MentorActivity extends AppCompatActivity implements MentorAdapter.OnMentorClickListener

并在 OnCreate 之外覆盖:

@Override
    public void onMentorClick(Mentor mentor) {
        Intent intent = new Intent(MentorActivity.this, MentorAddEditActivity.class);

        intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_ID, mentor.getMentor_id());
        intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_NAME, mentor.getMentor_name());
        intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_PHONE, mentor.getMentor_phone());
        intent.putExtra(MentorAddEditActivity.EXTRA_MENTOR_EMAIL, mentor.getMentor_email());

        startActivityForResult(intent, EDIT_MENTOR_REQUEST);
    }

这也不行。

关于我实际上无法在 RecyclerView 中单击导师的任何想法?

整个 MentorAdapter 以供澄清。这与我为 Mentor 更改了变量名的所有其他适配器尽可能相同。

public class MentorAdapter extends RecyclerView.Adapter<MentorAdapter.MentorHolder> {
    private static final String TAG = AppRepository.class.getSimpleName();

    private OnMentorClickListener listener;


    private List<Mentor> mentorList = new ArrayList<>();


    class MentorHolder extends RecyclerView.ViewHolder{
        private TextView textViewMentorName;
        private TextView textViewMentorPhone;
        private TextView textViewMentorEmail;


        MentorHolder(@NonNull View itemView) {
            super(itemView);
            textViewMentorName = itemView.findViewById(R.id.textView_mentor_name);
            textViewMentorPhone = itemView.findViewById(R.id.textView_mentor_phone);
            textViewMentorEmail = itemView.findViewById(R.id.textView_mentor_email);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if(listener!=null&&position!=RecyclerView.NO_POSITION){
                        listener.onMentorClick(mentorList.get(position));
                    }
                }
            });
        }
    }

    @NonNull
    @Override
    public MentorHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.mentor_item, parent, false);
        return new MentorHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MentorHolder holder, int position) {
        Mentor currentMentor = mentorList.get(position);
        holder.textViewMentorName.setText(currentMentor.getMentor_name());
        holder.textViewMentorEmail.setText(currentMentor.getMentor_email());
        holder.textViewMentorPhone.setText(currentMentor.getMentor_phone());

    }

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

    public void setMentorList(List<Mentor> mentors){
        this.mentorList = mentors;
        notifyDataSetChanged();
    }

    public Mentor getMentorAt(int position){return mentorList.get(position);}

    public interface OnMentorClickListener {
        void onMentorClick(Mentor mentor);
    }

    public void setOnMentorClickListener(OnMentorClickListener listener){
        this.listener = listener;
    }


}

在某些地方你需要调用这些回调,像这样:

profileView.setOnClickListener(new ....
     listener.onMentorListener(mentor);
)

您的 Adapter 中是否有此实现?

如果您要覆盖 onMentorClick,您的 activity 应该实现 OnMentorClickListener 接口,那么在您的适配器上,您应该将 activity 设置为您的侦听器:

mentorAdapter.setOnMentorClickListener(this)

在您的代码中,您使用的是新的点击侦听器(不是 activity)

mentorAdapter.setOnMentorClickListener(new MentorAdapter.OnMentorClickListener(){
            @Override
            public void onMentorClick(Mentor mentor) {

            }

});

此外,您应该在用户点击您的适配器实现时触发您的 onMentorClick,最好是在 onCreateViewHolder 方法中:

public YourAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {

    ViewHolder holder = ViewHolder(
        LayoutInflater.from(context).inflate(
            R.layout.your_layout,
            parent,
            false
        ))

    holder.itemView.setOnClickListener {
        listener.onMentorClick(mentor)
    }

    return holder ;
}

事实证明,在我用于为 Mentor RecyclerView 创建布局的 mentor_item.xml 文件中,我在顶层创建了一个横跨整个卡片的文件,但我没有对其进行任何操作。

一旦我从 xml 文件中删除了那个 ImageButton,点击就会被注册并且一切都按预期工作。

感谢大家的宝贵时间。