【问题标题】:RecylerView Button does not triggerRecyclerView 按钮不触发
【发布时间】:2017-05-09 15:36:23
【问题描述】:

我的回收卡中有一个按钮,用于显示popupMenu

但是,每当用户单击此按钮时,popupMenu 不会出现。即使我在 menuOptionsButton.Click 操作中设置了一个断点,它也没有命中。

XML 中的图像按钮

<ImageButton
    android:id="@+id/MoreSettings"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_alignParentRight="true"
    android:src="@drawable/ic_more_black_24dp" /> 

RecyclerViewAdapter.cs

public class RecyclerAdapter : MvxRecyclerAdapter
{
  private readonly FragmentActivity _activity;

  public RecyclerAdapter(IMvxAndroidBindingContext bindingContext, FragmentActivity activity)
        : base(bindingContext)
  {
    _activity = activity;
  }

  public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
  {
    base.OnBindViewHolder(holder, position);
    var view = holder.ItemView;
    var menuOptionsButton = view.FindViewById<ImageButton>(Resource.Id.MoreSettings);
    menuOptionsButton.Click += (s, e) =>
     {
         var popup = new PopupMenu(_activity, menuOptionsButton );
         popup.MenuInflater.Inflate(Resource.Menu.menu,popup.Menu);
         popup.Show();
     };
  }
}

如果我没有将popupMenu 放在点击动作中,那么recyclerview 中的每个项目都会显示popupMenu,但我希望有一个动作点击以显示popUpMenu

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
    base.OnBindViewHolder(holder, position);
    var view = holder.ItemView;
    var menuOptionsButton = view.FindViewById<ImageButton>(Resource.Id.MoreSettings);
    var popup = new PopupMenu(_activity, menuOptionsButton );
    popup.MenuInflater.Inflate(Resource.Menu.menu,popup.Menu);
    popup.Show();
}

更新:

Activity.cs

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    var ignored = base.OnCreateView(inflater, container, savedInstanceState);
    var view = this.BindingInflate(Resource.Layout.AView, null);   
    HasOptionsMenu = true;
    toolbar = ((MainView)Activity).SupportActionBar;   
    var recyclerView = view.FindViewById<MvxRecyclerView>(Resource.Id.ARecyclerView);
    if (recyclerView != null)
    {
        recyclerView.HasFixedSize = true;
        recyclerView.Adapter = new RecyclerAdapter((IMvxAndroidBindingContext)BindingContext, Activity);
        var layoutManager = new LinearLayoutManager(Activity);
        recyclerView.SetLayoutManager(layoutManager);
      }
    return view;
}

【问题讨论】:

  • id 不同MoreOptions vs MoreSettings
  • 抱歉,打错字了,我已修正并在我的问题中添加了其他信息。
  • 您是否正在使用设置为Sdk Assemblies OnlySdk and user Assemblies 的链接器进行构建?
  • 链接器属性是none
  • @hotspring 你有RecyclerView.ViewHolder 子类吗?你能添加你的RecyclerAdapter.OnCreateViewHolder覆盖吗....

标签: android xamarin android-recyclerview xamarin.android mvvmcross


【解决方案1】:

在您的 RecyclerView.Adapter 代码中,在 OnBindViewHolder 方法中添加 Click 委托时应该小心。如果您添加为 C# 匿名函数,则每次视图显示时都会添加一个新委托,而不是设置。

首先,您应该将此行放在 ViewHolder 构造方法中:

this.menuOptionsButton = view.FindViewById<ImageButton>(Resource.Id.MoreSettings);

那么,

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
    base.OnBindViewHolder(holder, position);
    var optionsButton = ((YourHolder)holder).menuOptionsButton;

    // This avoids adding a Click event more than once
    optionsButton.Click -= this.PopupShow;
    optionsButton.Click += this.PopupShow;
}

private void PopupShow(object sender, EventArgs e)
{
    Toast.MakeText(this.context, "Button clicked", ToastLength.Short).Show();
    var popup = new PopupMenu(_activity, menuOptionsButton );
    popup.MenuInflater.Inflate(Resource.Menu.menu,popup.Menu);
    popup.Show();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多