在Activity或Adapter类中向ListView的膨胀RowView添加事件?

时间:2017-11-21 17:00:29

标签: c# xamarin xamarin.android

我无法在我的Activity类的RowView中迭代我夸大的自定义ListView,并为充气的自定义RowView上的控件分配正确的事件。

是的,我可以在适配器类GetView()覆盖中向控件添加事件,但我认为存在一些问题。

  1. 我的印象是所有应用程序逻辑都应该存在于 Activity类和适配器应该只用于数据绑定。如果我将所有导航逻辑,CRUD操作等添加到Adpater中的控件中,则活动中不存在任何内容,适配器现在将负责应用程序逻辑,事件处理,数据库帮助程序类交互等。
  2. 我无法访问适配器中的StartActivity()this class,所以Adapter似乎不是添加导航逻辑的地方, 例如我想要一行按钮打开“详细视图”,但如果我不能 无法调用StartActivity()或传入适当的参数 Intent()
  3. 所以,我想我只是将事件添加到Activity类的控件中。下一个问题,在活动类中,我无法弄清楚如何迭代ListView项,例如没有ListView.Items集合可以迭代并将事件处理程序添加到各种控件中。

    我一直在其他地方走过几个Pluralsight课程和示例,通常那些在ListView_ItemClick上只有事件处理程序,它们被添加到Activity类中。这很简单,我已经实现了并且正在工作,但我无法在膨胀的自定义RowView

    上实现相同的控制

    有没有办法迭代RowViews的夸大自定义ListView?我错误地认为Activity vs Adapter中应该包含哪些代码?

    我不认为代码示例是必要的,因为这个问题更具概念性,但如果您对我当前的实现感兴趣,这是我的项目:https://github.com/jmbarnes1987/Namely

1 个答案:

答案 0 :(得分:1)

  1. 在适配器中实施View.IOnClickListener接口

  2. 在适配器中添加

    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. 3.在你的adpater的BindData()方法中,添加:

    deleteName.SetOnClickListener(this);
    
    editName.SetOnClickListener(this);
    

    4.在您的活动中,实施BabyNameListAdapter.InnerItemOnclickListenerAdapterView.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_ItemClick;

    替换babyNameListView.OnItemClickListener = this;

    8.运行你的项目。

    • 好的,现在您可以点击列表视图的行视图和行视图上的按钮,它将运行良好。
    • 您可以看到我使用界面将click事件设置为不在适配器中而是在活动中。编写逻辑代码没有明确的界限,只需要关注的一件事就是性能。
    • 如果要将参数传递给适配器,当然可以在适配器中使用startActivity(),但它会很复杂,所以使用接口可以在活动中处理这个。

    我希望它会对你有所帮助。