RecyclerView(一)点击事件的两种方式

recyclerview自身不带有点击事件的回调,以下实现recyclerview点击事件的两种方式

1、通过接口回调的方式:

直接上代码加注释
1、首先定义点击的接口

public interface OnItemClickListener {
    void onItemClick(View view, int position);
}
2、在recyclerview的adapter中实现点击方法

public class ListRecycleViewAdapter extends RecyclerView.Adapter<ListRecycleViewAdapter.ListViewHolder>{

    private Context mContext;
    private List<String> mList;

    public ListRecycleViewAdapter(Context context, List<String> list) {
        mContext = context;
        mList = list;
    }

    @Override
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ListViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_list_recycle_view, parent,
                false));
    }

    @Override
    public void onBindViewHolder(final ListViewHolder holder, int position) {
        holder.tv.setText(mList.get(position));

        View itemView = ((RelativeLayout) holder.itemView).getChildAt(0);

        if (mOnItemClickListener != null) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(holder.itemView, position);
                }
            });
        }
    }

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

    private OnItemClickListener mOnItemClickListener;//声明接口

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    class ListViewHolder extends RecyclerView.ViewHolder {
        TextView tv;

        public ListViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv_list_item);
        }
    }

}

3、在activity中使用

ListRecycleViewAdapter listRecycleViewAdapter = new ListRecycleViewAdapter(SettingActivity.this, mList);
   listRecycleViewAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {

            }
        }    

2,通过recyclerview的addOnItemTouchListener实现点击事件

    1、首先定义类RecyclerItemClickListener实现 RecyclerView.OnItemTouchListener接口,重写onLongPress()方法,onInterceptTouchEvent()方法,onTouchEvent()方法,onRequestDisallowInterceptTouchEvent()方法,并在本类内部定义一个点击监听的接口interface OnItemClickListener,接口内部设置两个方法onItemClick(),onLongClick()。下面上代码:
public static class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
        GestureDetector mGestureDetector;
        private View childView;
        private RecyclerView touchView;

        public RecyclerItemClickListener(Context context, final HomePageFragment.RecyclerItemClickListener.OnItemClickListener mListener) {
            mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent ev) {
                    if (childView != null && mListener != null) {
                        mListener.onItemClick(childView, touchView.getChildPosition(childView));
                    }
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent ev) {
                    if (childView != null && mListener != null) {
                        mListener.onLongClick(childView, touchView.getChildPosition(childView));
                    }
                }
            });
        }

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

            void onLongClick(View view, int posotion);
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            mGestureDetector.onTouchEvent(e);
            childView = rv.findChildViewUnder(e.getX(), e.getY());
            touchView = rv;
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    }

2、将我们的布局中定义recyclerview添加方法 addOnItemTouchListener()

rc_view.addOnItemTouchListener(new RecyclerItemClickListener(thisnew RecyclerItemClickListener.OnItemClickListener() {
  public void onItemClick(View view, int position) {
           //在此处做点击之后的逻辑处理@Override
            public void onLongClick(View view, int position) {
            //在此处做长按之后的逻辑处理
            //    Toast.makeText(getContext(), "长按", Toast.LENGTH_SHORT).show();
            }
 }
  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RecyclerView中实现点击事件两种方式: 1. 在onCreateViewHolder中注册点击事件: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; private OnItemClickListener mListener; public interface OnItemClickListener { void onItemClick(int position); } public void setOnItemClickListener(OnItemClickListener listener) { mListener = listener; } // ... @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); final ViewHolder viewHolder = new ViewHolder(view); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { int position = viewHolder.getAdapterPosition(); mListener.onItemClick(position); } } }); return viewHolder; } // ... public static class ViewHolder extends RecyclerView.ViewHolder { // ... public ViewHolder(View itemView) { super(itemView); // ... } } } ``` 2. 定义点击动作: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; public interface OnItemClickListener { void onItemClick(int position); } // ... @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); final ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { // ... holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理点击事件 } }); } // ... public static class ViewHolder extends RecyclerView.ViewHolder { // ... public ViewHolder(View itemView) { super(itemView); // ... } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值