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

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

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

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

import android.view.View;

//点击事件接口回调
public interface OnItemClickListener{
    void onItemClick(View view, int position);
}

2、在recyclerview的adapter中实现点击方法

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {
    public OnItemClickListener mOnItemClickListener;//声明接口

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


@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.fragment_card, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.mItem = mValues.get(position);
        holder.mTimeView.setText(mValues.get(position).time);
       

        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != mListener) {
                    // Notify the active callbacks interface (the activity, if the
                    // fragment is attached to one) that an item has been selected.
                    mListener.onListFragmentInteraction(holder.mItem);
                }
            }
        });

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

       

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;
        public final TextView mTimeView;
        
        public DummyItem mItem;

        public ViewHolder(View view) {
            super(view);
            mView = view;
            mTimeView = (TextView) view.findViewById(R.id.certLibFileTime);
            
        }
    }
}

3、在activity中使用

CardAdapter cardAdapter = new CardAdapter(CardDummyContent.ITEMS, mListener,context);
cardAdapter.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(View view, int position) {
                String fileName = CardDummyContent.ITEMS.get(position).time;
                Log.i(TAG,"cardName:"+fileName);
                
            }
        });

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(this,new RecyclerItemClickListener.OnItemClickListener() {
  public void onItemClick(View view, int position) {
           //在此处做点击之后的逻辑处理
  }
   @Override
            public void onLongClick(View view, int position) {
            //在此处做长按之后的逻辑处理
            //    Toast.makeText(getContext(), "长按", Toast.LENGTH_SHORT).show();
            }
 }

猜你喜欢

转载自blog.csdn.net/P876643136/article/details/84337240