C# 将事件添加到ListView';活动或适配器类中的行视图?

C# 将事件添加到ListView';活动或适配器类中的行视图?,c#,xamarin,xamarin.android,C#,Xamarin,Xamarin.android,我在活动类的列表视图中迭代膨胀的自定义行视图时遇到问题,无法将适当的事件分配给膨胀的自定义行视图上的控件 是的,我可以向适配器类GetView()override中的控件添加事件,但我认为这有几个问题 我的印象是,所有的应用程序逻辑都应该存在于 活动类和适配器应该只用于数据绑定。如果我将所有导航逻辑、CRUD操作等添加到Adpater中的控件中,那么活动中将没有任何内容,适配器现在将负责应用程序逻辑、事件处理、数据库助手类交互等 我无法访问适配器中的StartActivity()或此 类,因此适

我在活动类的
列表视图
中迭代膨胀的自定义
行视图
时遇到问题,无法将适当的事件分配给膨胀的自定义
行视图
上的控件

是的,我可以向适配器类
GetView()
override中的控件添加事件,但我认为这有几个问题

  • 我的印象是,所有的应用程序逻辑都应该存在于 活动类和适配器应该只用于数据绑定。如果我将所有导航逻辑、CRUD操作等添加到Adpater中的控件中,那么活动中将没有任何内容,适配器现在将负责应用程序逻辑、事件处理、数据库助手类交互等
  • 我无法访问适配器中的
    StartActivity()
    类,因此适配器似乎不是添加导航逻辑的地方, e、 g.我想在行上有一个按钮来打开“详细视图”,但如果我 无法调用
    StartActivity()
    或将正确的参数传递给
    Intent()
  • 所以,我想我应该将事件添加到Activity类中的控件中。下一个问题是,在activity类中,我不知道如何迭代
    ListView
    项,例如,没有要迭代的
    ListView.items
    集合并将事件处理程序添加到各个控件中

    我已经在其他地方浏览了几个Pluralsight课程和示例,通常这些课程和示例在活动类中添加的
    ListView\u ItemClick
    上刚刚有事件处理程序。这很简单,我已经实现并运行了它,但是我无法实现自定义
    行视图上控件的相同功能

    是否有一种方法可以迭代
    列表视图的膨胀自定义
    行视图
    ?我是否误解了活动vs适配器中应该包含哪些代码

    我认为不需要代码示例,因为这个问题更具概念性,但如果您对我当前的实现感兴趣,这里是我的项目:

  • 在适配器中实现
    视图.IOnClickListener
    界面

  • private InnerItemOnclickListener mListener;
    
    public interface InnerItemOnclickListener
    {
        void itemClick(View v);
    }
    
    public void SetOnInnerItemOnClickListener(InnerItemOnclickListener listener)
    {
        this.mListener = listener;
    }
    
    public void OnClick(View v)
    {
        mListener.itemClick(v);
    }
    
  • 将其添加到适配器中

    private InnerItemOnclickListener mListener;
    
    public interface InnerItemOnclickListener
    {
        void itemClick(View v);
    }
    
    public void SetOnInnerItemOnClickListener(InnerItemOnclickListener listener)
    {
        this.mListener = listener;
    }
    
    public void OnClick(View v)
    {
        mListener.itemClick(v);
    }
    
  • 3.在adpater的BindData()方法中,添加以下内容:

    deleteName.SetOnClickListener(this);
    
    editName.SetOnClickListener(this);
    
    4.在活动中,实现
    BabyNameListAdapter.InnerItemOnclickListener
    AdapterView.IOnItemClickListener
    界面

    5.在活动中添加以下内容:

    private BabyNameListAdapter Adapter;
    public void itemClick(View v)
        {
            int position;
            position = (int)v.Tag;
            switch (v.Id)
            {
                case Resource.Id.editNameButton:
                    System.Diagnostics.Debug.Write("editNameButton click"+" position="+position);
                    break;
                case Resource.Id.deleteNameButton:
                    System.Diagnostics.Debug.Write("deleteNameButton click" + " position=" + position);
                    break;
                default:
                    break;
            }
        }
    
        public void OnItemClick(AdapterView parent, View view, int position, long id)
        {
            System.Diagnostics.Debug.Write("RowView click");
        }
    
    6.将您的
    BindData()
    替换为:

    private void BindData()
    
    {
    
        Adapter = new BabyNameListAdapter(this, allBabyNames);
    
        Adapter.SetOnInnerItemOnClickListener(this);
    
        babyNameListView.Adapter=Adapter;
    
    
    }
    
    7.替换
    babyNameListView.ItemClick+=babyNameListView\u ItemClick带有
    babyNameListView.OnItemClickListener=this

    8.运行您的项目

    • 好的,现在您可以单击listview的rowview和rowview上的按钮,它会很好地工作
    • 您可以看到,我使用该接口不是在适配器中而是在活动中设置单击事件。在哪里编写逻辑代码没有明确的界限,唯一需要注意的是性能
    • 如果要将参数传递给适配器,当然可以在适配器中使用
      startActivity()
      ,但这会很复杂,所以可以使用接口在活动中处理此问题

    我希望它能对您有所帮助。

    谢谢您的回复,很抱歉耽误了回来,我正忙于度假。我实施了你建议的解决方案,效果很好。不过,我有几个问题你可以帮忙解决。首先,
    ItemClick(View v)
    逻辑似乎违反了OCP,因为如果我想添加/删除控件,我必须修改多个类,例如添加到适配器类、添加到活动案例语句等。这真的是Xamarin/Android中处理我的情况的最佳方式吗?看起来
    ItemClick(View v)
    逻辑有一种“坏味道”。其次,我无法将rowview实例本身添加到case语句中,因为没有
    Resource.Id.babyNameRowView
    ,所以我将OnClick逻辑扔到了开关的默认分支中,这起到了作用,但是,有没有一种方法可以在案例陈述中引用该实例呢?不管怎样,这给了我一些很好的帮助,我感谢您的帮助。今晚晚些时候,我将标记为答案,但我想有机会讨论我的评论。再次感谢。我接受了您的回答,但如果您能回复我的评论,我将不胜感激。关于您的第一个问题,我使用
    InnerItemOnclickListener
    界面将单击事件控件从
    BabyNameListAdapter
    更改为
    BabyNameExplorerActivity
    ,因此如果您添加/删除控件,你需要换两门课。