0

J'ai un bouton dans ma carte recycleur qui est nécessaire pour montrer un popupMenuBouton RecylerView ne justifie pas la

Cependant, chaque fois que l'utilisateur clique sur ce bouton, popupMenu ne semble pas. Même si je mets un point de rupture à l'intérieur de l'action menuOptionsButton.Click, il ne frappe pas.

ImageButton en 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(); 
    }; 
    } 
} 

Si je ne mets pas popupMenu dans l'action de clic, chaque élément de la recyclerview montre une popupMenu, mais Je veux avoir une action clique pour montrer 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(); 
} 

MISE À JOUR:

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; 
} 
+0

L'id est différent '' MoreOptions' vs MoreSettings' – Plac3Hold3r

+0

Désolé, il était faute de frappe, J'ai corrigé et ajoute également des informations supplémentaires à ma question. – hotspring

+0

Est-ce que vous construisez peut-être avec l'éditeur de liens défini sur 'Sdk Assemblies Only' ou' Sdk and user Assemblies'? – Plac3Hold3r

Répondre

0

votre code RecyclerView.Adapter, vous devez être prudent lors de l'ajout d'un délégué Cliquez dans la méthode OnBindViewHolder. Si vous ajoutez en tant que fonction anonyme C#, chaque fois que la vue affiche un nouveau délégué sera ajouté, non défini.

D'abord, vous devez placer cette ligne dans la méthode constructeur ViewHolder:

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

Ensuite,

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