xamarin学习笔记A06(安卓RecycleView点击事件)

不念不忘少年蓝@ 2022-06-14 10:50 303阅读 0赞

(每次学习一点xamarin就做个学习笔记视频来加深记忆巩固知识)
如有不正确的地方,请帮我指正。

实现RecyclerView中Item的基本点击事件
这里写图片描述

准备工作
从Nuget下载安装
Xamarin.Android.Support.v7.AppCompat
Xamarin.Android.Support.v7.RecyclerView

第一种实现点击事件的方式
主要用到RecyclerView.Adapter类,首先自定义MsgAdapter类继承自这个类,在每个Item视图创建的时候(OnCreateViewHolder)给其设置点击事件,Item视图有两个设置点击事件监听器的方法,一个是普通点击SetOnClickListener(),一个是长按点击SetOnLongClickListener,贴上部分代码:

  1. public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
  2. {
  3. View msgItemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.MsgItem, parent, false);
  4. MsgViewHolder holder = new MsgViewHolder(msgItemView);
  5. msgItemView.SetOnClickListener(this);
  6. msgItemView.SetOnLongClickListener(this);
  7. return holder;
  8. }

接着MsgAdapter实现接口OnClickListener的方法OnClick,实现接口IOnLongClickListener的方法OnLongClick把事件传递到外部(本例子外部即MainActivity)调用。
贴上部分代码:
自定义一个接口

  1. public interface IRecyclerViewItemClickListener //自定义的RecyclerView的Item的点击接口
  2. {
  3. void OnItemClick(View itemView, int position); //普通Click点击
  4. void OnItemLongClick(View itemView, MsgAdapter.MsgViewHolder msgViewHolder);//长按Click点击
  5. }

自定义的MsgAdapter类的代码

  1. public class MsgAdapter : RecyclerView.Adapter, IOnClickListener, IOnLongClickListener
  2. {
  3. private IRecyclerViewItemClickListener m_IRecyclerViewItemClickListener;
  4. public void SetIRecyclerViewClickListener(IRecyclerViewItemClickListener listener)
  5. {
  6. m_IRecyclerViewItemClickListener = listener;
  7. }
  8. public void OnClick(View v) //普通点击
  9. {
  10. int position = m_RecyclerView.GetLayoutManager().GetPosition(v);
  11. if (m_IRecyclerViewItemClickListener != null)
  12. m_IRecyclerViewItemClickListener.OnItemClick(v, position);
  13. }
  14. public bool OnLongClick(View v) //长按点击
  15. {
  16. MsgAdapter.MsgViewHolder holder = m_RecyclerView.GetChildViewHolder(v) as MsgAdapter.MsgViewHolder;
  17. if (m_IRecyclerViewItemClickListener != null)
  18. m_IRecyclerViewItemClickListener.OnItemLongClick(v, holder);
  19. return true;
  20. }
  21. }

第二种实现点击事件的方式(推荐)
主要用到RecyclerView.SimpleOnItemTouchListener和GestureDetector.SimpleOnGestureListener这两个类,使用RecyclerView.AddOnItemTouchListener(…)来添加点击事件

贴上部分代码

  1. // 手势监听器类
  2. public class MsgSimpleOnGestureListener : GestureDetector.SimpleOnGestureListener
  3. {
  4. private RecyclerView m_RecyclerView;
  5. private IRecyclerViewItemClickListener m_IRecyclerViewClickListerner;
  6. public MsgSimpleOnGestureListener(RecyclerView rv, IRecyclerViewItemClickListener listener)
  7. {
  8. m_RecyclerView = rv;
  9. m_IRecyclerViewClickListerner = listener;
  10. }
  11. public override bool OnSingleTapUp(MotionEvent e)//单击事件
  12. {
  13. View child = m_RecyclerView.FindChildViewUnder(e.GetX(), e.GetY());
  14. if (child != null)
  15. {
  16. RecyclerView.ViewHolder vh = m_RecyclerView.GetChildViewHolder(child);
  17. int position = vh.LayoutPosition;
  18. if (m_IRecyclerViewClickListerner != null)
  19. {
  20. m_IRecyclerViewClickListerner.OnItemClick(child, position);
  21. }
  22. }
  23. return true;
  24. }
  25. public override void OnLongPress(MotionEvent e)//长按事件
  26. {
  27. View child = m_RecyclerView.FindChildViewUnder(e.GetX(), e.GetY());
  28. if (child != null)
  29. {
  30. MsgAdapter.MsgViewHolder vh = m_RecyclerView.GetChildViewHolder(child) as MsgAdapter.MsgViewHolder;
  31. if (m_IRecyclerViewClickListerner != null)
  32. {
  33. m_IRecyclerViewClickListerner.OnItemLongClick(child, vh);
  34. }
  35. }
  36. }
  37. }
  38. // Item的触摸监听器类
  39. public class MsgSimpleOnItemTouchListener : RecyclerView.SimpleOnItemTouchListener
  40. {
  41. private RecyclerView m_RecyclerView;
  42. private GestureDetectorCompat m_GestureDetector;
  43. public MsgSimpleOnItemTouchListener(RecyclerView rv, MsgSimpleOnGestureListener simpleOnGestureListener)
  44. {
  45. m_RecyclerView = rv;
  46. m_GestureDetector = new GestureDetectorCompat(rv.Context, simpleOnGestureListener);
  47. }
  48. public override bool OnInterceptTouchEvent(RecyclerView rv, MotionEvent e)
  49. {
  50. if (m_GestureDetector.OnTouchEvent(e))
  51. return true;
  52. else
  53. return false;
  54. }
  55. public override void OnTouchEvent(RecyclerView rv, MotionEvent e)
  56. {
  57. }
  58. }

RecyclerView列表中的Item视图的添加,删除,移动操作
对RecyclerView列表中的Item视图的添加,删除,移动操作分别是用到RecyclerView.Adapter里的三个方法:
NotifyItemInserted(int position)
NotifyItemRemoved(int position)
NotifyItemMoved(int fromPosition, int toPosition)

完整代码和视频在我上传的CSDN资源中http://download.csdn.net/download/junshangshui/9873240

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读