(每次学习一点xamarin就做个学习笔记视频来加深记忆巩固知识)
如有不正确的地方,请帮我指正。
实现RecyclerView中Item的基本点击事件
准备工作
从Nuget下载安装
Xamarin.Android.Support.v7.AppCompat
Xamarin.Android.Support.v7.RecyclerView
第一种实现点击事件的方式
主要用到RecyclerView.Adapter类,首先自定义MsgAdapter类继承自这个类,在每个Item视图创建的时候(OnCreateViewHolder)给其设置点击事件,Item视图有两个设置点击事件监听器的方法,一个是普通点击SetOnClickListener(),一个是长按点击SetOnLongClickListener,贴上部分代码:
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View msgItemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.MsgItem, parent, false);
MsgViewHolder holder = new MsgViewHolder(msgItemView);
msgItemView.SetOnClickListener(this);
msgItemView.SetOnLongClickListener(this);
return holder;
}
接着MsgAdapter实现接口OnClickListener的方法OnClick,实现接口IOnLongClickListener的方法OnLongClick把事件传递到外部(本例子外部即MainActivity)调用。
贴上部分代码:
自定义一个接口
public interface IRecyclerViewItemClickListener //自定义的RecyclerView的Item的点击接口
{
void OnItemClick(View itemView, int position); //普通Click点击
void OnItemLongClick(View itemView, MsgAdapter.MsgViewHolder msgViewHolder);//长按Click点击
}
自定义的MsgAdapter类的代码
public class MsgAdapter : RecyclerView.Adapter, IOnClickListener, IOnLongClickListener
{
private IRecyclerViewItemClickListener m_IRecyclerViewItemClickListener;
public void SetIRecyclerViewClickListener(IRecyclerViewItemClickListener listener)
{
m_IRecyclerViewItemClickListener = listener;
}
public void OnClick(View v) //普通点击
{
int position = m_RecyclerView.GetLayoutManager().GetPosition(v);
if (m_IRecyclerViewItemClickListener != null)
m_IRecyclerViewItemClickListener.OnItemClick(v, position);
}
public bool OnLongClick(View v) //长按点击
{
MsgAdapter.MsgViewHolder holder = m_RecyclerView.GetChildViewHolder(v) as MsgAdapter.MsgViewHolder;
if (m_IRecyclerViewItemClickListener != null)
m_IRecyclerViewItemClickListener.OnItemLongClick(v, holder);
return true;
}
}
第二种实现点击事件的方式(推荐)
主要用到RecyclerView.SimpleOnItemTouchListener和GestureDetector.SimpleOnGestureListener这两个类,使用RecyclerView.AddOnItemTouchListener(…)来添加点击事件
贴上部分代码
// 手势监听器类
public class MsgSimpleOnGestureListener : GestureDetector.SimpleOnGestureListener
{
private RecyclerView m_RecyclerView;
private IRecyclerViewItemClickListener m_IRecyclerViewClickListerner;
public MsgSimpleOnGestureListener(RecyclerView rv, IRecyclerViewItemClickListener listener)
{
m_RecyclerView = rv;
m_IRecyclerViewClickListerner = listener;
}
public override bool OnSingleTapUp(MotionEvent e)//单击事件
{
View child = m_RecyclerView.FindChildViewUnder(e.GetX(), e.GetY());
if (child != null)
{
RecyclerView.ViewHolder vh = m_RecyclerView.GetChildViewHolder(child);
int position = vh.LayoutPosition;
if (m_IRecyclerViewClickListerner != null)
{
m_IRecyclerViewClickListerner.OnItemClick(child, position);
}
}
return true;
}
public override void OnLongPress(MotionEvent e)//长按事件
{
View child = m_RecyclerView.FindChildViewUnder(e.GetX(), e.GetY());
if (child != null)
{
MsgAdapter.MsgViewHolder vh = m_RecyclerView.GetChildViewHolder(child) as MsgAdapter.MsgViewHolder;
if (m_IRecyclerViewClickListerner != null)
{
m_IRecyclerViewClickListerner.OnItemLongClick(child, vh);
}
}
}
}
// Item的触摸监听器类
public class MsgSimpleOnItemTouchListener : RecyclerView.SimpleOnItemTouchListener
{
private RecyclerView m_RecyclerView;
private GestureDetectorCompat m_GestureDetector;
public MsgSimpleOnItemTouchListener(RecyclerView rv, MsgSimpleOnGestureListener simpleOnGestureListener)
{
m_RecyclerView = rv;
m_GestureDetector = new GestureDetectorCompat(rv.Context, simpleOnGestureListener);
}
public override bool OnInterceptTouchEvent(RecyclerView rv, MotionEvent e)
{
if (m_GestureDetector.OnTouchEvent(e))
return true;
else
return false;
}
public override void OnTouchEvent(RecyclerView rv, MotionEvent e)
{
}
}
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