簡體   English   中英

列表視圖中的 Android Xamarin 按鈕

[英]Android Xamarin Button inside a ListView

我想在我的一項活動中創建對象的ListView ,每一行都應該有TextView和 3 個按鈕。 當我單擊不想在ListView '適配器上處理它們的按鈕時,我想在我的 Activity 中使用它們。

有沒有辦法在我的活動中聲明按鈕並為它們設置OnClickListener() 此外,我需要在ListView中獲取按鈕 position 。 換句話說,我想在我的活動中做類似的事情:

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

祝你好運

如果您有任何疑問,請隨時回復。

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

Activity 將有 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);
        }
    }

並且查看器將具有按鈕單擊事件。 從適配器傳遞的動作將在點擊事件中被調用。 因此,按鈕單擊事件將傳播到活動。

 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,則此代碼將添加到適配器本身中。

我最終做了類似於 FreakyAli 的回答的事情,但是改變了它,所以我可以在我的活動中而不是在適配器中實現我的點擊事件:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM