我创建了一个RecyclerView适配器,我试图在单击一行时启动一个活动:
public override OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
MyViewHolder viewHolder = (MyViewHolder)holder;
viewHolder.MyView.Click += (sender, e) =>
{
var context = viewHolder.MyView.Context;
var intent = new Intent(context, typeof(DetailActivity));
context.StartActivity(intent);
}
}
当我点击第一行时,它会带我参加我想要的活动。如果我向下滚动以便第一行反弹,然后再次滚动回到顶部,然后单击第一行,然后我的Click事件触发两次。一次为绑定的第一行,然后再为我滚动时绑定的行。
您是否需要处理取消注册点击事件的事件?
答案 0 :(得分:4)
我认为标准模式是在ViewHolder的构造函数中设置clickhandler。然后在OnBindViewHolder中,更新ViewHolder中的Views / Data。
像这样(不是编译代码):
适配器:
public override OnBindViewHolder()
{
MyViewHolder viewHolder = (MyViewHolder)holder;
viewHolder.SetData(whatever data you care about);
}
MyViewHolder:
public MyViewHolder(View view) : base(view)
{
MainView = view;
MainView.Click += (sender, e) =>
{
var context = MainView.Context;
var intent = new Intent(context, typeof(DetailActivity));
context.StartActivity(intent);
}
}
这样做可以通过将业务逻辑放在ViewHolder中来保持适配器更清洁,并且还可以防止点击处理程序在滚动时不断设置和拆除。