xamarin 是否将事件添加到Activity或Adapter类中ListView的膨胀RowView?

dvtswwa3  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(112)

我在Activity类的ListView中迭代膨胀的自定义RowView时遇到了麻烦,也无法将适当的事件分配给膨胀的自定义RowView上的控件。
是的,我可以在适配器类GetView()覆盖中向控件添加事件,但我认为这有几个问题。
1.我的印象是所有的应用程序逻辑都应该存在于Activity类中,而适配器应该只用于数据绑定。如果我将所有的导航逻辑、CRUD操作等添加到适配器中的控件中,那么Activity中就没有任何东西存在了,适配器现在将负责应用程序逻辑、事件处理、数据库助手类交互等。
1.我无法访问Adapter类中的StartActivity()this,因此Adapter似乎不是添加导航逻辑的地方,例如,我希望在行上添加一个按钮以打开“详细信息视图”,但如果我无法调用StartActivity()或向Intent()传递正确的参数,则无法这样做。
因此,我想我只需要将事件添加到Activity类中的控件中。下一个问题是,在Activity类中,我不知道如何迭代ListView项,例如,没有ListView.Items集合可供迭代并将事件处理程序添加到各种控件中。
我已经在其他地方学习了一些Pluralsight课程和示例,通常这些课程和示例只是在ListView_ItemClick上添加了事件处理程序,而ListView_ItemClick是添加在Activity类中的。这非常简单,我已经实现了它并在工作,但是我无法为膨胀的自定义RowView上的控件实现同样的效果
有没有办法迭代ListView的膨胀自定义RowViews?我是不是搞错了什么代码应该存在于Activity vs Adapter中?

ttcibm8c

ttcibm8c1#

1.在适配器中实现View.IOnClickListener接口
1.将此添加到适配器中

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.in 您适配器的BindData()方法,添加以下内容:

deleteName.SetOnClickListener(this);

editName.SetOnClickListener(this);

4.in 您的活动,实现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.run 您的项目。

  • 好了,现在你可以点击列表视图的行视图和行视图上的按钮了,这样就可以正常工作了。
  • 你可以看到我使用接口来设置click事件不是在adapter中而是在activity中。在哪里写逻辑代码没有明确的界限,唯一需要关心的是性能。
  • 当然,如果你想把参数传递给适配器,你可以在适配器中使用startActivity(),但是这会很复杂,所以你可以使用接口在你的活动中处理这个问题。

希望对你有帮助。

相关问题