使用onClickListener for recyclerView无法正常工作

时间:2016-10-11 09:24:43

标签: android android-recyclerview

我在Android上使用onclickListener时遇到了问题。 我已经为onClick编写了这段代码,但在运行应用程序时,它并没有响应我的点击。 我在ViewHolder类上创建了onClick并实现了onClickListener接口。

这是我的代码:

public class AdapterLessons extends RecyclerView.Adapter<AdapterLessons.ViewHolderLessons> {
private List<Lesson> mListLessons = Collections.emptyList();
private LayoutInflater mInflater;
public Context context;


public AdapterLessons(Context context, List<Lesson> listLesson) {
    mInflater = LayoutInflater.from(context);
    this.mListLessons = listLesson;
    this.context = context;

}
@Override
public ViewHolderLessons onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.layout_list_item_lesson, parent, false);
    return new ViewHolderLessons(view,context,mListLessons);
}

@Override
public void onBindViewHolder(ViewHolderLessons holder, final int position) {
    final Lesson currentLesson = mListLessons.get(position);

    holder.lessonText.setText(currentLesson.getLesssonName());

    if(currentLesson.get_id() % 2 == 0) {
        holder.relativeLayoutLesson.setBackgroundResource(R.color.tablesecond);
    }
    else
    {
        holder.relativeLayoutLesson.setBackgroundResource(R.color.tablefirst);
    }

}

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

static class ViewHolderLessons extends ViewHolder implements View.OnClickListener{

    TextView lessonText;
    RelativeLayout relativeLayoutLesson ;
    Context context;
    List<Lesson> lessonList = Collections.emptyList();


    ViewHolderLessons(View itemView, Context context,List<Lesson> lessonList) {
        super(itemView);
        this.context = context;
        this.lessonList = lessonList;
        lessonText = (TextView) itemView.findViewById(R.id.lessonText);
        relativeLayoutLesson = (RelativeLayout)itemView.findViewById(R.id.rlTextLesson);
    }
    @Override
    public void onClick(View v) {
        int position = getAdapterPosition();
        Lesson l = lessonList.get(position);
        Toast.makeText(context, l.get_id(), Toast.LENGTH_SHORT).show();
    }
}

}

4 个答案:

答案 0 :(得分:1)

在持有人的建筑师中,你忘了给他打电话:

itemView.setOnclickListener(this);

答案 1 :(得分:0)

在onBindViewHolder中尝试:

   holder.relativeLayoutLesson.setTag(position);  

   holder.relativeLayoutLesson.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                  Integer pos = (Integer) v.getTag();
                  Lesson l = lessonList.get(position);
                  Toast.makeText(context, l.get_id(), Toast.LENGTH_SHORT).show();
                  notifyDataSetChanged();
                }
            });

例如你的onBindViewHolder()应该是这样的:

@Override
public void onBindViewHolder(ViewHolderLessons holder, final int position) {
    final Lesson currentLesson = mListLessons.get(position);

    holder.lessonText.setText(currentLesson.getLesssonName());

    if(currentLesson.get_id() % 2 == 0) {
        holder.relativeLayoutLesson.setBackgroundResource(R.color.tablesecond);
    }
    else
    {
        holder.relativeLayoutLesson.setBackgroundResource(R.color.tablefirst);
    }




 holder.relativeLayoutLesson.setTag(position);  

holder.relativeLayoutLesson.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                  Integer pos = (Integer) v.getTag();
                  Lesson l = lessonList.get(position);
                  Toast.makeText(context, l.get_id(), Toast.LENGTH_SHORT).show();
                  notifyDataSetChanged();
                }
            });

}

答案 2 :(得分:0)

您的适配器应将onClick事件委托给在构造函数上传递的接口。请检查此答案:Why doesn't RecyclerView have onItemClickListener()? And how RecyclerView is different from Listview?

答案 3 :(得分:0)

您可以创建自己的OnClickListener。

首先在适配器类中创建接口,或者像这样创建新文件:

public interface OnLessonClickListener{
        void onLessonClick(Lesson lesson);
}

然后在适配器类中创建此接口的对象:

private OnLessonClickListener listener;

然后你需要创建初始化这个监听器的方法:

public void setOnLessonClickListener(OnLessonClickListener l){
        listener = l;
}

在ViewHolder类中,您应该在itemView上设置setOnClickListener。在方法onClick上点击。

itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if(listener != null) {
                    listener.onLessonClick(lessonList.get(getAdapterPosition));
                }
            });

这个机制的结束将在类中实现你想要获得课程对象的监听器:

AdapterLessons adapter = new AdapterLessons(context, new ArrayList<Lesson>);

如果你实现了监听器:

adapter.setOnLessonClickListener(this)

如果不是:

adapter.setOnLessonClickListener(new OnLessonClickListener(){
    @Override
    public void onLessonClick(Lesson l){
        Log.e("TAGA", "Lesson is "+l);
    }
});

希望它有所帮助。

抱歉我的英文。