简体   繁体   English

C# Xamarin.Android 从 recyclerView 调用 Dialogfragment

[英]C# Xamarin.Android Calling Dialogfragment from recyclerView

I would like to display diaglog fragment by clicking a button/imageView (By clicking the sAddButton)from recyclerView.我想通过单击 recyclerView 中的按钮/imageView(通过单击 sAddButton)来显示 diaglog 片段。 But when I clicked the button nothing shows up.但是当我点击按钮时,什么都没有出现。 How do I achieve that here is my code.我如何实现这是我的代码。

My RecyclerView Adapter I added an pulic eventhandler in myadapter (StockInItemClick) then created a delegate method to invoke the eventhandler(OnStockInClick) then pass the delegate method as parameter on my adapterview holder then Implement the delegate method on my adapterview holder.我的 RecyclerView 适配器我在 myadapter (StockInItemClick) 中添加了一个公共事件处理程序,然后创建了一个委托方法来调用事件处理程序 (OnStockInClick),然后将委托方法作为参数传递给我的适配器视图持有者,然后在我的适配器视图持有者上实现委托方法。

internal class StocksAdapter : RecyclerView.Adapter
{
    public event EventHandler<StocksAdapterClickEventArgs> ItemClick;
    public event EventHandler<StocksAdapterClickEventArgs> ItemLongClick;
    public event EventHandler<StocksAdapterClickEventArgs> StockInItemClick;
    List<Products> items;

    public StocksAdapter(List<Products> data)
    {
        items = data;
    }

    
    // Create new views (invoked by the layout manager)
    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {

        //Setup your layout here
        View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.stock_rView, parent, false);
        //var id = Resource.Layout.__YOUR_ITEM_HERE;
        //itemView = LayoutInflater.From(parent.Context).
        //       Inflate(id, parent, false);
        

        var vh = new StocksAdapterViewHolder(itemView, OnClick, OnLongClick, OnStockInClick);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
    {
        
        var holder = viewHolder as StocksAdapterViewHolder;
        //holder.TextView.Text = items[position];
        holder.sNameText.Text = items[position].PName;
        holder.sQtyText.Text = items[position].QtyonHand;
    }

    public override int ItemCount => items.Count;

    void OnClick(StocksAdapterClickEventArgs args) => ItemClick?.Invoke(this, args);
    void OnLongClick(StocksAdapterClickEventArgs args) => ItemLongClick?.Invoke(this, args);
    void OnStockInClick(StocksAdapterClickEventArgs args) => StockInItemClick?.Invoke(this, args);
}

public class StocksAdapterViewHolder : RecyclerView.ViewHolder
{
    //public TextView TextView { get; set; }

    public TextView sNameText { get; set; }
    public TextView sQtyText { get; set; }
    public ImageButton sAddButton { get; set; }

    public StocksAdapterViewHolder(View itemView, Action<StocksAdapterClickEventArgs> clickListener,
                        Action<StocksAdapterClickEventArgs> longClickListener,
                        Action<StocksAdapterClickEventArgs> stockInClickListener) : base(itemView)
    {
        //TextView = v;
        sNameText = (TextView)itemView.FindViewById(Resource.Id.sNameTView);
        sQtyText = (TextView)itemView.FindViewById(Resource.Id.qtyonhandTView);
        sAddButton = (ImageButton)itemView.FindViewById(Resource.Id.addButton);

        itemView.Click += (sender, e) => clickListener(new StocksAdapterClickEventArgs { View = itemView, Position = AdapterPosition });
        itemView.LongClick += (sender, e) => longClickListener(new StocksAdapterClickEventArgs { View = itemView, Position = AdapterPosition });
        sAddButton.Click += (sender, e) => longClickListener(new StocksAdapterClickEventArgs { View = itemView, Position = AdapterPosition });
        
    }
}

public class StocksAdapterClickEventArgs : EventArgs
{
    public View View { get; set; }
    public int Position { get; set; }
}

my code in activity I implement the eventhandler then on the event onlcick event(Adapter_StockInItemClick) I called the dialog fragment.我在活动中的代码实现了事件处理程序,然后在事件 onlcick 事件(Adapter_StockInItemClick)上我调用了对话框片段。

private void SetupRecyclerView()
{
    stockRView.SetLayoutManager(new Android.Support.V7.Widget.LinearLayoutManager(stockRView.Context));
    adapter = new StocksAdapter(StockList);
    adapter.StockInItemClick += Adapter_StockInItemClick;
    stockRView.SetAdapter(adapter);
}

private void Adapter_StockInItemClick(object sender, StocksAdapterClickEventArgs e)
{
    Products thisproducts = StockList[e.Position];
    addNewStockInProductsFragment = new AddNewStockInProductsFragment(thisproducts);
    var trans = SupportFragmentManager.BeginTransaction();
    addNewStockInProductsFragment.Show(trans, "StockIn");
}

Found the problem发现问题

sAddButton.Click += (sender, e) => longClickListener(new StocksAdapterClickEventArgs { View = itemView, Position = AdapterPosition });

shouldbe (deleteClickListener) not (longClickListener)应该是(deleteClickListener)而不是(longClickListener)

sAddButton.Click += (sender, e) => deleteClickListener(new StocksAdapterClickEventArgs { View = itemView, Position = AdapterPosition });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM