Ho un RecyclerView con 2 elementi che non riempiono l'intero schermo. Come posso rilevare che l'utente ha fatto clic sulla parte vuota di RecyclerView (che significa che è stato fatto clic direttamente su RecyclerView e non su uno dei suoi elementi)?Rileva clic su RecyclerView al di fuori degli articoli
risposta
È possibile creare una sottoclasse di RecyclerView
e sovrascrivere il metodo dispatchTouchEvent()
per ottenere ciò. Usando il metodo findChildViewUnder()
, possiamo determinare se un evento tattile si verifica al di fuori delle viste secondarie e utilizzare un interface
per notificare un listener, se lo è. Nell'esempio seguente, OnNoChildClickListener
interface
fornisce tale funzionalità.
public class TouchyRecyclerView extends RecyclerView
{
// Depending on how you're creating this View,
// you might need to specify additional constructors.
public TouchyRecyclerView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
private OnNoChildClickListener listener;
public interface OnNoChildClickListener
{
public void onNoChildClick();
}
public void setOnNoChildClickListener(OnNoChildClickListener listener)
{
this.listener = listener;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
// The findChildViewUnder() method returns null if the touch event
// occurs outside of a child View.
// Change the MotionEvent action as needed. Here we use ACTION_DOWN
// as a simple, naive indication of a click.
if (event.getAction() == MotionEvent.ACTION_DOWN
&& findChildViewUnder(event.getX(), event.getY()) == null)
{
if (listener != null)
{
listener.onNoChildClick();
}
}
return super.dispatchTouchEvent(event);
}
}
NB: Questo è adattato per RecyclerView
da my answer here relativa GridView
.
Come accennato nel commento
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
if (motionEvent.getAction() != MotionEvent.ACTION_UP) {
return false;
}
View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
if (child != null) {
// tapped on child
return false;
} else {
// Tap occured outside all child-views.
// do something
return true;
}
}
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
}
});
Dovrebbe anche controllare MotionEvent.getAction() == ACTION_UP, altrimenti, si ottengono 2 eventi click. –
Grazie @ greg-ennis. Ho aggiornato il codice. –
Questa dovrebbe essere la risposta accettata. Inoltre dovrebbe probabilmente essere 'return false;' piuttosto che 'return;' sotto la parte 'MotionEvent.ACTION_UP'. –
Hai solo bisogno di impostare un TouchListener
sul RecyclerView
come mostrato sopra:
categoryTable.setAdapter(new CatgoriesAdapter(categories.getWrappedList()));
categoryTable.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN
&& categoryTable.findChildViewUnder(event.getX(), event.getY()) == null)
{
// Touch outside items here, you do whatever you want
HideCategoryMenu();
}
return false;
}
});
@ risposta di Driss-Bounouar è quasi giusto anche se questo impedirà il l'utente dallo scorrimento della vista del riciclatore come qualsiasi evento inatteso causerà l'azione. Con una leggera modifica in cui registriamo l'evento down e quindi controlliamo l'evento up se le coordinate non sono cambiate molto, quindi attivate l'evento.
private MotionEvent lastRecyclerViewDownTouchEvent;
myRecyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && myRecyclerView.findChildViewUnder(event.getX(), event.getY()) == null) {
lastRecyclerViewDownTouchEvent = event;
} else if (event.getAction() == MotionEvent.ACTION_UP && myRecyclerView.findChildViewUnder(event.getX(), event.getY()) == null
&& lastRecyclerViewDownTouchEvent != null) {
// Check to see if it was a tap or a swipe
float xDelta = Math.abs(lastRecyclerViewDownTouchEvent.getX() - event.getX());
float yDelta = Math.abs(lastRecyclerViewDownTouchEvent.getY() - event.getY());
if (xDelta < 30 && yDelta < 30) {
// Do action
}
lastRecyclerViewDownTouchEvent = null;
}
return false;
}
});
- 1. Rileva clic fuori div utilizzando javascript
- 2. Griglia RecyclerView con diverse dimensioni degli articoli
- 3. Rileva clic su elemento esterno?
- 4. Come sapere quando RecyclerView ha terminato la posa degli articoli?
- 5. Disabilita clic su RecyclerView all'interno di SwipeRefreshLayout
- 6. Rileva elemento clic su UIWebView
- 7. Rileva l'animazione in Android RecyclerView
- 8. Cattura clic al di fuori di un div assoluta posizionato
- 9. LayoutManager per RecyclerView per impostare automaticamente il numero di colonne in base alla larghezza degli articoli
- 10. Rileva clic su evento in background
- 11. articoli centro orizzontalmente in RecyclerView (utilizzando GridLayoutManager)
- 12. Come ottenere clic su RecyclerView (NON i bambini)
- 13. Ottenere un riferimento a ViewHolder su RecyclerView Fare clic su
- 14. Come contare gli articoli RecyclerView con Espresso
- 15. articoli RecyclerView duplicati e in continuo cambiamento
- 16. più articoli RecyclerView in uno CardView
- 17. android recyclerview non visualizza gli articoli
- 18. Come conservare l'ordine degli articoli aggiunti al set abbinato jQuery?
- 19. Recyclerview (articolo su Recyclerview)
- 20. Come limitare la visibilità degli articoli?
- 21. rubinetti veloci (clic) su RecyclerView apre più Frammenti
- 22. Come utilizzare SwipeDismissBehavior.OnDismissListener su RecyclerView
- 23. Come gestire i clic degli articoli per una visualizzazione riciclatore utilizzando RxJava
- 24. Impostazione Focus su nuovi elementi nel controllo degli articoli
- 25. Nessuna animazione sulla rimozione degli oggetti su RecyclerView
- 26. Barra degli strumenti non nascosta su RecyclerView scroll
- 27. Come disabilitare il disegno della decorazione di un oggetto RecyclerView per la durata delle animazioni degli articoli
- 28. Come specificare l'ordine degli articoli in ReactCSSTransitionGroup?
- 29. Rileva il pulsante dell'auricolare fai clic su iPhone SDK
- 30. Non sai come nascondere un div quando si fa clic al di fuori della div
Grazie mille! Ho finito per usare recyclerView.addOnItemTouchListener con findChildViewUnder (..). – Omar
@Omar Ah! Molto bene! Mi sto ancora familiarizzando con RecyclerView e non ero ancora a conoscenza di quell'interfaccia. Grazie per le informazioni! Dovresti creare una risposta per questo. Riceverai un preventivo da me. –