Ho un ListView
, ognuno dei cui elementi è un orizzontale RecyclerView
. Il problema che sto affrontando è, lo scorrimento orizzontale non è molto liscia. Se faccio scorrere/scorri in una direzione perfettamente orizzontale, allora funziona bene, ma se lo scorrimento è anche leggermente non orizzontale (diciamo con un angolo di 10 gradi rispetto all'orizzontale), lo considero come scorrimento su/giù piuttosto che a sinistra/destra, a causa del genitore ListView
. Ho provato questo metodo:Recycler orizzontaleVista all'interno di ListView non scorrevole molto scorrevole
recyclerView.setOnTouchListener(new FlingRecyclerView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
Log.i("Scroll down", "Intercept true");
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
// Handle HorizontalScrollView touch events.
v.onTouchEvent(event);
return true;
}
});
Ma non è stato molto efficace. In effetti, non ho notato molti miglioramenti. Questo perché motionEvent viene chiamato solo quando il movimento è perfettamente orizzontale - quel caso sta già funzionando bene. Poi ho provato a fare questo:
class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
Log.i("TAG", "VelocityX " + Float.toString(velocityX) + "VelocityY " + Float.toString(velocityY));
Log.i("TAG", "e1X " + Float.toString(e1.getX()) + "e1Y " + Float.toString(e1.getY()) + "e2X " + Float.toString(e2.getX()) + "e2Y " + Float.toString(e2.getY()));
// downward swipe
if (e2.getY() - e1.getY() > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Downward Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Downward swipe");
}
else if (e1.getY() - e2.getY() > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Upward Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Upward swipe");
}
// right to left swipe
else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Left swipe");
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Right swipe");
}
} catch (Exception e) {
// nothing
}
return false;
}
}
E ho notato che registra gli eventi solo quando ho comunicato il mio dito, non quando avvio il colpo. Non funziona non appena tocco lo RecyclerView
. E anche questo non è riuscito a produrre alcun miglioramento evidente. Ho notato anche una cosa che questi metodi sono in qualche modo dipendenti anche dalla pressione. Quando ho fatto un colpo con una leggera pressione, non è successo nulla. E la stessa cosa fatta nello stesso percorso, con maggiore pressione produce scroll.
C'è un modo per rendere scorrevole lo scorrimento anche se il percorso del passaggio del mouse non è orizzontale o anche se il movimento è di tipo circolare? Qualsiasi aiuto sarebbe molto apprezzato.
Che cosa si otterrà utilizzando un recyclerview all'interno di listview per il solo bisogno di scorrimento orizzontale? – Brendon
@Brendon Il mio layout è di un feed. Può scorrere verticalmente e ogni elemento in ListView è una galleria. E la galleria ha alcuni post che possono essere scrollati orizzontalmente. –
Quindi hai solo bisogno di scorrere orizzontalmente a destra? Basta usare lo scorrimento orizzontale all'interno gonfiando una vista in esso, scorrerà liscio e perfetto .. Prova questo in modo alternativo .. – Brendon