RecyclerView слушатель кликов не срабатывает при щелчке строк - PullRequest
1 голос
/ 11 февраля 2020

Редактировать Кажется, что мой @Override для onMentorClick (наставник наставника) никогда не доступен.

У меня есть вид переработчика, который показывает список людей. Мне нужно иметь возможность нажать на одного из людей в списке и открыть новое действие.

в моем адаптере у меня есть следующий код:

private OnMentorClickListener listener;

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

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

в моей деятельности, у меня есть следующий код:

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

Я реализовал слушатели для других части моего приложения точно так же, и все они работают. Я искал свой код, и эта настройка, кажется, идентична другим разделам кода.

Я не получаю ошибок, но когда я нахожусь на своей странице "Менторы" и перечисляю всех наставников, ничего не происходит, когда я нажимаю на одну из них. Нет ошибок, нет сбоев, нет ничего.

Я также пытался просто внедрить пролив OnMentorClickListener в класс Activity, как показано ниже:

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

This тоже не работает.

Есть какие-нибудь мысли о том, что я не могу щелкнуть наставника в 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;
    }


}

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Если вы переопределяете onMentorClick ваша активность должна реализовывать интерфейс OnMentorClickListener, тогда на вашем адаптере вы должны установить активность в качестве слушателя с помощью:

mentorAdapter.setOnMentorClickListener(this)

В вашем коде вы используете новый прослушиватель щелчков (не активность)

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 ;
}
1 голос
/ 16 февраля 2020

Оказывается, что в моем файле mentor_item. xml, который использовался для создания макета для Mentor RecyclerView, я создал всю карту на верхнем слое, с которой я ничего не делал.

Как только я удалил этот ImageButton из файла xml, щелчки регистрировались, и все работало как задумано.

Спасибо за всеобщее время.

0 голосов
/ 11 февраля 2020

В каком-то месте вам нужен вызов для этих Callback, что-то вроде этого:

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

У вас есть эта реализация в вашем адаптере?

...