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,此代码将添加到适配器本身。
我想在我的一个活动中创建 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,此代码将添加到适配器本身。