Android ListView 中的 Xamarin 按钮

Android Xamarin Button inside a ListView

我想在我的一个活动中创建 ListView 个对象,每行应该有 TextView 和 3 个按钮。当我单击按钮时,我不想在 ListView' 适配器上处理它们,我想在我的 Activity.

中使用它们

有什么方法可以在我的 activity 中声明按钮并为它们设置 OnClickListener() 吗?此外,我需要获取 ListView 中的按钮位置。 换句话说,我想在 activity:

中做类似的事情
button = listView.FindViewById<Button>(Resource.Id.button);
button.SetOnClickListener(this);

并在 public void OnClick(View v) 中执行以下操作:

if (v == button)
{
    int positionInList = /* something */;
    //...
}

最简单的方法是在 GetView 方法中添加点击事件:

public View GetView( int position, View convertView, ViewGroup parent) 
{
    .
    .
    .
    .
    yourButton.Click+= (sender,eventArgs) =>
    {
       // Your event 
    }
});

祝你好运

如有任何疑问,请随时回来。

我最终做了类似于 FreakyAli 的回答的事情,但对其进行了更改,以便我可以在我的 activity 而不是在适配器中实现我的点击事件:

if (!button.HasOnClickListeners)
{
    button.Click += delegate {
        ((MyActivity)context).MyButtonClickFunction(position);
    };
}

您也可以使用委托。以下是代码示例

Activity 将有 listview 或 recyclerview。需要在 activity 中处理的方法将作为操作传递给适配器。

public void CreateListView()
{
 testAdapter = new TestAdapter(vm.ForageSamples.ToList(), OnClick);
 recyclerView.SetAdapter(testAdapter);
}

private void OnClick(EventArgs e)
{
 //your logic
}

动作(委托)将传递给适配器。该操作将传递给 ViewHolder。

 public class TestAdapter : RecyclerView.Adapter
    {
        List<Sample> forageTests;
        private readonly Action<EventArgs> activityClick;

        public TestAdapter(List<Sample> tests, Action<EventArgs> activityClick)
        {
            this.forageTests = tests;
            this.activityClick = activityClick;
        }

        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            var layout = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.template_foragetests, parent, false);
            return new TestViewHolder(layout, activityClick);
        }
    }

并且viewholder会有按钮点击事件。从适配器传递过来的动作将在点击事件中被调用。因此,按钮单击事件将传播到 activity.

 public class TestViewHolder : RecyclerView.ViewHolder
    {
        private Action<EventArgs> activityClick;
        private Button addButton;

        public TestViewHolder (View itemView, Action<EventArgs> activityClick) : base(itemView)
        {
             this.activityClick = activityClick;
             addButton = itemView.FindViewById<Button>(Resource.Id.addbutton);
            addButton.Click += OnClick;
        }
     
        void OnClick(object sender, EventArgs e)
        {
            activityClick(e);
        }
    }

如果您当时不使用 viewholder,此代码将添加到适配器本身。