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
risposta
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!
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;
}
}
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);
}
int position = getAdapterPosition() posizione di ritorno del clic su i tem. –
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;
}
});
}
}
- 1. Modifica ritardo lungo clic
- 2. Rimuovi nella vista riciclatore layout a griglia
- 3. espresso lungo clic sulla voce di menu e menu popup
- 4. SoapServer, guasto sulla maniglia() - Procedura non impostare
- 5. mappe android: Come fare un clic lungo su una mappa?
- 6. Problemi con viste dinamiche all'interno del punto di vista del riciclatore
- 7. Maniglia invito a GKTurnBasedMatch senza centro gioco controller di vista
- 8. Come disabilitare il listener dei clic sulla vista immagine android
- 9. Margine tra gli elementi in vista riciclatore Android
- 10. Sul lungo clic Elimina elemento
- 11. Come impedire che gli elementi vengano duplicati durante lo scorrimento della vista del riciclatore
- 12. Backbone.js View Fai clic sulla sintassi del selettore eventi?
- 13. jQuery Slider UI - Disabilita clic sulla traccia di slittamento
- 14. Set clic lungo listener per ListView
- 15. Pulsante destro del mouse della maniglia Doppio clic per la forma
- 16. non firmato lungo lungo vs non firmato lungo (punto di vista della portabilità)
- 17. Troppi test sulla vista semplice?
- 18. Ombre sulla vista di Android
- 19. Come sovrapporre la vista sulla barra del controller di navigazione?
- 20. animazione angolare interfaccia utente del router sulla vista padre
- 21. Come gestire i clic degli articoli per una visualizzazione riciclatore utilizzando RxJava
- 22. Fare doppio clic sulla riga in NSTableView non visualizza la nuova vista
- 23. ContextMenu non appare a lungo. Fare clic su
- 24. Arresto anomalo dell'app quando si fa clic sulla casella di selezione nella vista web
- 25. WebView Android, l'impostazione del clic lungo è abilitata sui collegamenti esclusivamente?
- 26. Maniglia JobExecutionException in Quartz.net
- 27. Emulazione fare clic sulla mappa opuscolo elemento
- 28. Maniglia CTRL + C su Win32
- 29. Facendo clic sulla tastiera "Avanti" utilizzando UIAutomation
- 30. Fare doppio clic sulla riga DataGridView?
possibile duplicato di [Come creare menu di scelta rapida per RecyclerView] (http://stackoverflow.com/questions/26466877/how-to-create-context-menu-for-recyclerview) –