2015-05-06 20 views
18

Ich habe einen Adapter, der ein recyclerView paßt und ich möchte auf langen Click-Ereignisse auf recyclerView ‚s Elementen ein Popup-Menü öffnen. Wie kann ich das tun?Griff zum Produkt klicken lange auf Recycler Ansicht

+1

möglich Duplikat von [Wie erstellt man Kontextmenü für RecyclerView] (http://stackoverflow.com/questions/26466877/how-to-create-context-menu-for-recyclerview) –

Antwort

7

Zuerst müssen Sie Ihre Aktivität registrieren longClick Ereignisse aus dem recyclerView (so dass Sie nicht verwenden, um jede Art von onLongClickListener ...) zu hören:

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 dem Sie Kontextmenü registriert für Sie diese Methoden überschreiben:

@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, haben Sie den Code in Ihre RecyclerView Adapter wie folgt zu ändern:

Kontextmenü und Intercept-Benutzer zeigen Auswahl
@Override 
    public void onBindViewHolder(final DocumentViewHolder viewHolder, int position) { 

     ... 
     viewHolder.itemView.setLongClickable(true); 
     ... 
    } 

Jetzt können Sie sind! Aber Sie sind nicht in der Lage zu wissen, welche Artikel der Benutzer geklickt hat, dies zu tun, Sie eine benutzerdefinierte RecyclerView wie diese verwenden (Original-Code 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; 
    } 

} 

Im vorherigen onContextItemSelected() Methode Sie wissen können, die recyclerView Artikel-ID und die Position mit diesem Code:

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

Schließlich müssen Sie das GetItemID() -Methode in Ihrem recyclerView Adapter und die Layout-Datei, um sicherzustellen, ändern, dass Sie Ihre recyclerView und nicht die android eines verwenden!

21

Dies wurde bereits beantwortet here. Wie auch immer, man kann es wie folgt tun:

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { 
    private Article article; 

    private TextView nameTextView; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     itemView.setOnClickListener(this); 
     itemView.setOnLongClickListener(this); 
     nameTextView = (TextView) itemView.findViewById(R.id.grid_item_article_name_textView); 
    } 

    public void bind(Article article) { 
     this.article = article; 
     nameTextView.setText(article.getName()); 
    } 

    @Override 
    public void onClick(View view) { 
     // Context context = view.getContext(); 
     // article.getName() 
    } 

    @Override 
    public boolean onLongClick(View view) { 
     // Handle long click 
     // Return true to indicate the click was handled 
     return true; 
    } 
} 
0

ich schwer zu kämpfen hatte, die Position von Punkt auf Klick zu holen, das ist für mich gearbeitet:

public void onClick(View view) { 
    ViewHolder holder =(ViewHolder)view.getTag(); 
    int position = holder.getLayoutPosition(); 
    Log.d("testing ","pos" +position); 
} 
+0

int position = getAdapterPosition() wird Rückkehrposition von angeklickt i tem. –

3

ich auf diese Weise tat:

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