【问题标题】:Android Xamarin Button inside a ListViewListView 中的 Android Xamarin 按钮
【发布时间】:2021-04-26 23:58:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# android listview button xamarin.android


    【解决方案1】:

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

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

    祝你好运

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

    【讨论】:

      【解决方案2】:

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

      Activity 将有 listview 或 recyclerview。需要在activity中处理的方法,将作为action传递给Adapter。

      public void CreateListView()
      {
       testAdapter = new TestAdapter(vm.ForageSamples.ToList(), OnClick);
       recyclerView.SetAdapter(testAdapter);
      }
      
      private void OnClick(EventArgs e)
      {
       //your logic
      }
      

      Action(委托)将被传递给适配器。该操作将传递给 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会有按钮点击事件。从适配器传递的动作将在点击事件中被调用。因此,按钮点击事件将被传播到活动。

       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,那么这段代码将被添加到适配器本身中。

      【讨论】:

        【解决方案3】:

        我最终做了一些类似于 FreakyAli 的回答,但改变了它,以便我可以在我的活动中而不是在适配器中实现我的点击事件:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          • 2014-08-10
          • 1970-01-01
          相关资源
          最近更新 更多