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
- RecyclerView点击事件OnItemClick的两种实现方式
- RecyclerView(一)点击事件的两种方式
- RecyclerView的item点击事件(点击和长按)的两种实现
- recyclerView onitemClick事件详解
- RecyclerView实现点击事件
- RecyclerView onItemClick 按钮和布局都有单击事件时的处理方式
- RecycleView设置点击的两种方式:adapter中的onBindViewHolder(VH,int)方法中进行;实现RecyclerView的addonItemTouchListerner()
- RecyclerView的点击事件及实现
- RecyclerView的Item点击事件实现总结
- RecyclerView 实现点击的另外一种方式
- RecyclerView的点击事件
- RecyclerView的点击事件
- RecyclerView的点击事件
- RecyclerView的点击事件
- RecyclerView的点击事件
- RecyclerView 的点击事件!
- RecyclerView的点击事件
- RecyclerView 的点击事件
- linux内存管理--高端内存映射
- java 多线程yield
- html \n -> <br/>
- STL之Ranges区间讨论
- 核桃的数量(三个数的最小公倍数)
- RecyclerView点击事件OnItemClick的两种实现方式
- STM32 PWM快速开关端口电平问题
- 函数重载和覆盖的关系
- 设计模式之初识UML图
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- 打造万能的ListView GridView 适配器
- AlertDialog单选、多选对话框详解
- 白盒测试中的六种覆盖方法案例分析
- POJ 1308(Is it a tree并查集)