2015-05-06 15 views
18

Ho un adattatore che personalizza un recyclerView e voglio aprire un menu a comparsa sull'evento a lungo clic sugli articoli di recyclerView. Come posso fare questo?Maniglia sull'elemento clic lungo sulla vista del riciclatore

+1

possibile duplicato di [Come creare menu di scelta rapida per RecyclerView] (http://stackoverflow.com/questions/26466877/how-to-create-context-menu-for-recyclerview) –

risposta

7

In primo luogo è necessario registrare l'Activity di ascoltare gli eventi longClick dalla recyclerView (in modo da non dover utilizzare alcun tipo di onLongClickListener ...):

registerForContextMenu(recyclerView); 

Poi si crea una risorsa di menu (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> 

Nell'attività in cui ti sei registrato per il menu contestuale che si ignorare questa modalità:

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

Questo è molto importante, è necessario modificare il codice nel tuo adattatore RecyclerView in questo modo:

@Override 
    public void onBindViewHolder(final DocumentViewHolder viewHolder, int position) { 

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

Ora sono in grado di visualizzare il menu contestuale e selezione dell'utente intercetta! Ma non sono in grado di sapere quale oggetto l'utente fa clic, per fare questo è necessario utilizzare un RecyclerView personalizzato come questo (codice originale da 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; 
    } 

} 

Nel onContextItemSelected() metodo precedente si può sapere l'id recyclerView voce e la posizione utilizzando questo codice:

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

Infine si deve modificare il metodo() getItemId l'adattatore recyclerView e il file di layout per assicurarsi che si utilizza il recyclerView e non quello android!

21

Questo è già stato risposto here. In ogni caso, si può fare in questo modo:

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

stavo lottando duramente per recuperare la posizione della voce al clic, questo ha funzionato per me:

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

int position = getAdapterPosition() posizione di ritorno del clic su i tem. –

3

ho fatto in questo modo:

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