Recyclerview触摸事件

时间:2016-09-22 11:27:07

标签: android android-recyclerview

这是我第一次使用RecyclerView时,我使用一些静态模拟数据创建了Adapter类。

public static class ViewHolder extends RecyclerView.ViewHolder{

        public TextView textView;

        public ViewHolder(View view){

            super(view);

            textView = (TextView)view.findViewById(R.id.MyTextView);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        view1 = LayoutInflater.from(context).inflate(R.layout.item, parent ,false);

        Toast.makeText(context, "@@@@@@@@@@@@" +viewType, Toast.LENGTH_SHORT).show();

        viewHolder1 = new ViewHolder(view1);

        return viewHolder1;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.textView.setText(SubjectValues[position]);
    }

    @Override
    public int getItemCount() {
        return SubjectValues.length;
    }
}

这是我的Adapter clas,现在它显示了我想要实现点击事件的模拟数据。

5 个答案:

答案 0 :(得分:3)

在Adapter类中,在onBindViewHolder()方法中,您可以将侦听器注册到整行,如下所示:

vh1.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
                Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show();
            }
        });

如果要将侦听器注册到行布局中的特定视图,可以按以下方式执行:

vh1.getButton().setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
        Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show();
    }
});

适配器类的完整源代码:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    switch (viewHolder.getItemViewType()) {
        case USER:
            ViewHolder1 vh1 = (ViewHolder1) viewHolder;
            configureViewHolder1(vh1, position);
            break;
    }
}

private void configureViewHolder1(ViewHolder1 vh1, int position) {
    User user = (User) items.get(position);
    if (user != null) {
        vh1.getLabel1().setText("Name: " + user.name);
        vh1.getLabel2().setText("Hometown: " + user.hometown);

        vh1.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
                Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show();
            }
        });
        vh1.getButton().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show;
                Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

ViewHolder1.java

public class ViewHolder1 extends RecyclerView.ViewHolder {

    private TextView label1, label2;

    private Button button;

    public ViewHolder1(View v) {
        super(v);
        ...
        button = (Button) v.findViewById(R.id.button);
    }

    public Button getButton() {
        return button;
    }

    public void setButton(Button button) {
        this.button = button;
    }
}

答案 1 :(得分:2)

在onBindViewHolder中设置OnClickListener

@Override
    public void onBindViewHolder(final HomeListAdapter.MainViewHolder homeViewHolder, final int position) {

        homeViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(this, "Item no: "+ position, LENGTH_SHORT).show;
            }
        });
}

使用这种方式可以使项目布局不仅可以查看文本视图或按钮。 如果您想要点击按钮或textveiew进行操作,那么您可以使用这些组件的参考,例如 holder.button.setOnClickListener(new OnClick ..)......

答案 2 :(得分:0)

要添加点击事件,请将以下内容添加到onBindViewHolder方法中:

mysql -uroot

这会在textView中添加一个点击监听器,显示值的祝酒词 注意:我已经假设你的SubjectValues是什么,不包括在你的问题中。

但这里要注意的重要事项是:

  • holder.getAdapterPosition()
  • 检查位置(!= RecyclerView.NO_POSITION)
  • 在onBindViewHolder
  • 中设置此项

我相信这是如何在recyclerview适配器中设置点击侦听器的公平摘要。

答案 3 :(得分:0)

将此课程添加到您的项目中

public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        return true;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}

public interface OnItemClickListener {
    void onItemClick(View view, int position);
}}

然后在您的RecyclerView中使用此

    myRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            YourModel model = modelList.get(position);
      }
    }));

答案 4 :(得分:0)

OnItemClickListener接口添加到适配器中。

OnItemClickListener mItemClickListener;

public interface OnItemClickListener {
    public void onItemClick(View view, int position);
}

public void setOnItemClickListener(
        final OnItemClickListener mItemClickListener) {
    this.mItemClickListener = mItemClickListener;
}

OnItemClickListener上实施ViewHolder,如下所示。

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView textView;

    public ViewHolder(View view){
        super(view);
        textView = (TextView)view.findViewById(R.id.MyTextView);
        view.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (mItemClickListener != null) {
            mItemClickListener.onItemClick(v, getAdapterPosition());
        }
    }       
}

在适配器上的活动或片段setOnItemClickListener中。

 mAdapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
          // Do your stuff here when item clicked
        }
    });