C# 列表视图中的Android Xamarin按钮

C# 列表视图中的Android Xamarin按钮,c#,android,listview,button,xamarin.android,C#,Android,Listview,Button,Xamarin.android,我想在我的一个活动中创建一个对象的ListView,每行应该有TextView和3个按钮。当我在列表视图”适配器上单击我不想处理的按钮时,我想在我的活动中使用它们 有没有办法在我的活动中声明按钮并为它们设置OnClickListener()?此外,我还需要获取列表视图中的按钮位置。 换句话说,我想在我的活动中做一些类似的事情: button = listView.FindViewById<Button>(Resource.Id.button); button.SetOnClickLi

我想在我的一个活动中创建一个对象的
ListView
,每行应该有
TextView
和3个按钮。当我在
列表视图
”适配器上单击我不想处理的按钮时,我想在我的活动中使用它们

有没有办法在我的活动中声明按钮并为它们设置
OnClickListener()
?此外,我还需要获取
列表视图中的按钮位置。
换句话说,我想在我的活动中做一些类似的事情:

button = listView.FindViewById<Button>(Resource.Id.button);
button.SetOnClickListener(this);

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

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


如果您有任何疑问,请随时返回。

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

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

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

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

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);
        }
    }
公共类TestAdapter:RecyclerView.Adapter { 测试清单; 私有只读操作activityClick; 公共测试适配器(列表测试、操作活动单击) { 此。forageTests=测试; this.activityClick=activityClick; } public override RecyclerView.ViewHolder OnCreateViewHolder(视图组父级,int-viewType) { var layout=LayoutInflater.From(parent.Context).flate(Resource.layout.template_for getests,parent,false); 返回新的TestViewHolder(布局、活动单击); } }
和viewholder将有按钮单击事件。从适配器传递的操作将在单击事件中调用。因此,按钮单击事件将传播到活动

 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);
        }
    }
公共类TestViewHolder:RecyclerView.ViewHolder
{
私人行动舔;
私人按钮添加按钮;
公共TestViewHolder(查看项目视图、操作活动单击):基本(项目视图)
{
this.activityClick=activityClick;
addButton=itemView.FindViewById(Resource.Id.addButton);
addButton.Click+=OnClick;
}
void OnClick(对象发送方,事件参数)
{
活动点击(e);
}
}
如果您不使用viewholder,则此代码将添加到适配器本身中

 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);
        }
    }