RecyclerView点击事件OnItemClick的两种实现方式

来源:互联网 发布:栖霞区网络问政 编辑:程序博客网 时间:2024/06/06 15:01

RecyclerView点击事件实现的两种方式

support-library V7包中RecyclerView并没有为Item开放OnItemClick点击事件,所以开发者要自己实现。

代码已上传到github

目前有两种实现方式:

1. 第一种实现方式,在ViewHolder中的item根布局设置点击事件:

Demo示例:

这里写图片描述

代码:当然这是sdk samples中提供的示例代码,so easy,一个字符未改直接贴出

adpter类

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {    private static final String TAG = "CustomAdapter";    private String[] mDataSet;    /**     * Provide a reference to the type of views that you are using (custom ViewHolder)     */    public static class ViewHolder extends RecyclerView.ViewHolder {        private final TextView textView;        public ViewHolder(View v) {            super(v);            // Define click listener for the ViewHolder's View.            v.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    Log.d(TAG, "Element " + getPosition() + " clicked.");                }            });            textView = (TextView) v.findViewById(R.id.textView);        }        public TextView getTextView() {            return textView;        }    }    /**     * Initialize the dataset of the Adapter.     *     * @param dataSet String[] containing the data to populate views to be used by RecyclerView.     */    public CustomAdapter(String[] dataSet) {        mDataSet = dataSet;    }    // Create new views (invoked by the layout manager)    @Override    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {        // Create a new view.        View v = LayoutInflater.from(viewGroup.getContext())                .inflate(R.layout.text_row_item, viewGroup, false);        return new ViewHolder(v);    }    // Replace the contents of a view (invoked by the layout manager)    @Override    public void onBindViewHolder(ViewHolder viewHolder, final int position) {        Log.d(TAG, "Element " + position + " set.");        // Get element from your dataset at this position and replace the contents of the view        // with that element        viewHolder.getTextView().setText(mDataSet[position]);    }    // Return the size of your dataset (invoked by the layout manager)    @Override    public int getItemCount() {        return mDataSet.length;    }}

使用,更没啥好说,两行代码

  mAdapter = new CustomAdapter(mDataset);  // Set CustomAdapter as the adapter for RecyclerView.  mRecyclerView.setAdapter(mAdapter);

2. 第二种实现方式,第一种方式实现起来虽然简单,但是点击事件事件直接与适配器发生了耦合,因此我喜欢通过RecyclerView已有的OnItemTouchListener监听器配合手势来实现点击事件:

Demo示例:

这里写图片描述
代码:
实现OnItemTouchListener接口

public class RecyclerOnItemClickListener implements RecyclerView.OnItemTouchListener {    private OnItemClickListener mListener;    private GestureDetector mGestureDetector;    public interface OnItemClickListener {        public void onItemClick(View view, int position);        public void onItemLongClick(View view, int position);    }    public RecyclerOnItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {        mListener = listener;        mGestureDetector = new GestureDetector(context,                new GestureDetector.SimpleOnGestureListener() {                    @Override                    public boolean onSingleTapUp(MotionEvent e) {                        return true;                    }                    @Override                    public void onLongPress(MotionEvent e) {                        View childView = recyclerView.findChildViewUnder(                                e.getX(), e.getY());                        if (childView != null && mListener != null) {                            mListener.onItemLongClick(childView,                                    recyclerView.getChildPosition(childView));                        }                    }                });    }    @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.getChildPosition(childView));            return true;        }        return false;    }    @Override    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {    }    @Override    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }}

Activity中使用

 mRecyclerView.setAdapter(mAdapter); mRecyclerView.addOnItemTouchListener(new RecyclerOnItemClickListener(this, mRecyclerView, this));@Override    public void onItemClick(View view, int position) {    //点击跳转到详情    startActivity(DemoDetailActivity.getStartIntent(position, list.get(position)).setClass(this,DemoDetailActivity.class));    }    @Override    public void onItemLongClick(View view, int position) {    }

=============finish=========================

0 0