c# - 为什么我的 RecyclerView 没有响应我的自定义 Click-Event?
问题描述
我正在使用本教程。
我正在使用没有表单的 API 27 和 Xamarin Android。
a 的基本用法RecyclerView
在本教程的上一步中进行了说明,下一步是通过 Click-Handlers 扩展示例。
我用这段代码扩展了我的适配器public event EventHandler<int> ItemClick;
并创建了一个回调函数,如下所示:
void OnItemClick (object sender, int position)
{
Console.WriteLine("I've done it!");
}
并将其添加到适配器中,如下所示:
mAdapter = new CustomObjectAdapter(mCustomObject);
mAdapter.ItemClick += OnItemClick;
应用程序出现后,我在Console.WriteLine
-Part 上设置了一个 Breckpoint 并触摸/单击了显示的图像。但该事件不会触发。
这是我的适配器类:
class ModuleClassContainerAdapter : RecyclerView.Adapter
{
public event EventHandler<int> ItemClick;
public ModuleClassContainer mModuleClassContainer;
public ModuleClassContainerAdapter(ModuleClassContainer moduleClassContainer)
{
mModuleClassContainer = moduleClassContainer;
}
public override int ItemCount
{
get { return mModuleClassContainer.NumModules; }
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
ModuleViewHolder vh = holder as ModuleViewHolder;
var imageBitmap = BitmapFactory.DecodeByteArray(mModuleClassContainer[position].ImageBytes, 0, mModuleClassContainer[position].ImageBytes.Length);
// Load the photo image resource from the photo album:
vh.Image.SetImageBitmap(imageBitmap);
// Load the photo caption from the photo album:
vh.Caption.Text = mModuleClassContainer[position].ModuleName;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
// Inflate the CardView for the photo:
View itemView = LayoutInflater.From(parent.Context).
Inflate(Resource.Layout.ModuleCardView, parent, false);
// Create a ViewHolder to hold view references inside the CardView:
ModuleViewHolder vh = new ModuleViewHolder(itemView);
return vh;
}
}
这就是我设置适配器的方式:
private void SetupView()
{
RunOnUiThread(() =>
{
mModuleClassContainerAdapter = new ModuleClassContainerAdapter(mModuleClassContainer);
mModuleClassContainerAdapter.ItemClick += MModuleClassContainerAdapter_ItemClick;
mRecyclerView.SetAdapter(mModuleClassContainerAdapter);
mModuleClassContainerAdapter.NotifyDataSetChanged();
});
}
为什么我的事件没有被触发?
解决方案
在您的适配器中,声明 eventHandler,并将其传递给 ViewHolder
public class ModuleClassContainerAdapter : RecyclerView.Adapter
{
// Event handler for item clicks:
public event EventHandler<int> ItemClick;
// Create a new photo CardView (invoked by the layout manager):
public override RecyclerView.ViewHolder
OnCreateViewHolder (ViewGroup parent, int viewType)
{
// You need to pass the event
ModuleViewHolder vh = new ModuleViewHolder (itemView, OnClick);
return vh;
}
// Raise an event when the item-click takes place:
void OnClick (int position)
{
if (ItemClick != null)
ItemClick (this, position);
}
在您的 ViewHolder 中
public class ModuleViewHolder : RecyclerView.ViewHolder
{
// Get references to the views defined in the CardView layout.
public ModuleViewHolder (View itemView, Action<int> listener)
: base (itemView)
{
on the item view and report which item
// was clicked (by layout position) to the listener:
itemView.Click += (sender, e) => listener (base.LayoutPosition);
}
}
推荐阅读
- python - 如何加快 for 循环或使用替代方法?
- c++ - 如何使用 libevent 在 C++ 中发出 HEAD 请求
- node.js - 在nodejs中将二进制转换为base64
- ios - 从 Swift 中的其他类更改 ViewController 的对象
- angular - 在 Material Design 表行上使用 [ngClass]
- arrays - 嗨,我在设置动态数组的长度时不断遇到访问冲突
- java - org.apache.spark.sql.AnalysisException:没有这样的结构字段
- r - 如何有效地测试时间序列中的空间/时间自相关
- quickfixj - 支持 Java 7 的最后一个 quickfix 版本是哪个?
- reactjs - 如何从上一页获取模态窗口的背景位置,就像 Unsplash 一样?