单击行时未触发 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,点击就会被注册并且一切都按预期工作。
感谢大家的宝贵时间。
编辑 似乎我的 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,点击就会被注册并且一切都按预期工作。
感谢大家的宝贵时间。