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