Handle auf Artikel lange Klick auf Recycler Ansicht

Ich habe einen Adapter, der ein recyclerView und ich möchte ein Popup-Menü auf Langklick-Event auf recyclerView 's Items öffnen. Wie kann ich das machen?

  • Fehler beim Aufblasen der Klasse und android.support.v7.widget.CardView
  • Was ist das Äquivalent von listview.getCount im Falle von Recyclerview
  • Wie bekomme ich die Größe von recyclerview 's Item in "onBindViewHolder"
  • Erhalten Sie sichtbare Elemente in RecyclerView
  • Ermittlung der Erscheinungsansicht im LayoutManager-Pre-Layout
  • Picasso Image Misplacement Problem bei der Verwendung mit RecyclerView
  • Android-Symbolleiste bewegt sich, wenn die Tastatur erscheint
  • RecyclerView vs. ListView
  • 4 Solutions collect form web for “Handle auf Artikel lange Klick auf Recycler Ansicht”

    Dies wurde hier bereits beantwortet. Wie auch immer, du kannst es so machen:

     class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private Article mArticle; private TextView mNameTextView; public ViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); mNameTextView = (TextView) itemView.findViewById(R.id.grid_item_article_name_textView); } public void bind(Article article) { mArticle = article; mNameTextView.setText(article.getName()); } @Override public void onClick(View view) { // Context context = view.getContext(); // mArticle.getName() } @Override public boolean onLongClick(View view) { // Handle long click } } 

    Zuerst musst du deine Aktivität registrieren, um longClick-Events aus dem recyclerView zu hören (also musst du keine Art von onLongClickListener …):

     registerForContextMenu(recyclerView); 

    Dann erstellen Sie eine Menüressource (context_menu.xml):

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="Mostra documento" android:id="@+id/context_menu_documents_fragment_view"></item> <item android:title="Aggiungi ad un contenitore" android:id="@+id/context_menu_documents_fragment_add_to_box"></item> <item android:title="Elimina documento" android:id="@+id/context_menu_documents_fragment_delete"></item> </menu> 

    In der Aktivität, in der Sie sich für das Kontextmenü registriert haben, überschreiben Sie diese Methoden:

     @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); // Inflate Menu from xml resource MenuInflater menuInflater = getActivity().getMenuInflater(); menuInflater.inflate(R.menu.context_menu_documents_fragment, menu); } @Override public boolean onContextItemSelected(MenuItem item) { Toast.makeText(getActivity(), " User selected something ", Toast.LENGTH_LONG).show(); return false; } 

    Das ist sehr wichtig, du musst den Code in deinem RecyclerView Adapter wie folgt ändern:

     @Override public void onBindViewHolder(final DocumentViewHolder viewHolder, int position) { ... viewHolder.itemView.setLongClickable(true); ... } 

    Jetzt können Sie das Kontextmenü anzeigen und die Benutzerauswahl abhören. Aber du bist nicht in der Lage zu wissen, welches Element der Benutzer geklickt hat, um dies zu tun, musst du einen benutzerdefinierten RecyclerView wie diesen verwenden (Originalcode von Renaud Cerrato):

     public class ContextMenuRecyclerView extends RecyclerView { private RecyclerContextMenuInfo mContextMenuInfo; public ContextMenuRecyclerView(Context context) { super(context); } public ContextMenuRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public ContextMenuRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected ContextMenu.ContextMenuInfo getContextMenuInfo() { return mContextMenuInfo; } @Override public boolean showContextMenuForChild(View originalView) { final int longPressPosition = getChildAdapterPosition(originalView); if (longPressPosition >= 0) { final long longPressId = getAdapter().getItemId(longPressPosition); mContextMenuInfo = new RecyclerContextMenuInfo(longPressPosition, longPressId); return super.showContextMenuForChild(originalView); } return false; } public static class RecyclerContextMenuInfo implements ContextMenu.ContextMenuInfo { public RecyclerContextMenuInfo(int position, long id) { this.position = position; this.id = id; } final public int position; final public long id; } } 

    In der vorherigen onContextItemSelected() -Methode können Sie die recyclerView Item-ID und Position mit diesem Code kennen:

     ContextMenuRecyclerView.RecyclerContextMenuInfo info = (ContextMenuRecyclerView.RecyclerContextMenuInfo) item.getMenuInfo(); 

    Schließlich musst du die Methode getItemId () in deinem recyclerView Adapter und der Layoutdatei ändern, um sicherzustellen, dass du deine recyclerView und nicht die Android eins hast!

    Ich habe auf diese Weise:

     static class ViewHolder extends RecyclerView.ViewHolder { TextView tvName; ViewHolder(View v) { super(v); tvName = (TextView) v.findViewById(R.id.textView_Username); //Single Tapup v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show(); } }); //Long Press v.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Toast.makeText(v.getContext(), "Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show(); return false; } }); } } 

    Ich kämpfte schwer, um die Position des Artikels auf Klick zu holen, das hat für mich gearbeitet:

     public void onClick(View view) { ViewHolder holder =(ViewHolder)view.getTag(); int position = holder.getLayoutPosition(); Log.d("testing ","pos" +position); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.