繁体   English   中英

C# Xamarin.Android 从 recyclerView 调用 Dialogfragment

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

我想通过单击 recyclerView 中的按钮/imageView(通过单击 sAddButton)来显示 diaglog 片段。 但是当我点击按钮时,什么都没有出现。 我如何实现这是我的代码。

我的 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; }
}

我在活动中的代码实现了事件处理程序,然后在事件 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");
}

发现问题

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

应该是(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