android - setcolorschemecolors - swiperefreshlayout ejemplo
HorizontalScrollView dentro de SwipeRefreshLayout (3)
Lo resolví extendiendo SwipeRefreshLayout
y reemplazando su onInterceptTouchEvent
. En el interior, calculo si la distancia X que el usuario ha recorrido es más grande que la pendiente del toque. Si lo hace, significa que el usuario está deslizando horizontalmente, por lo tanto devuelvo false
que le permite al niño ver (el HorizontalScrollView
en este caso) para obtener el evento táctil.
public class CustomSwipeToRefresh extends SwipeRefreshLayout {
private int mTouchSlop;
private float mPrevX;
public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPrevX = MotionEvent.obtain(event).getX();
break;
case MotionEvent.ACTION_MOVE:
final float eventX = event.getX();
float xDiff = Math.abs(eventX - mPrevX);
if (xDiff > mTouchSlop) {
return false;
}
}
return super.onInterceptTouchEvent(event);
}
}
Implementé el nuevo componente SwipeRefreshLayout
en mi aplicación y funciona bien con cualquier vista vertical, como ListView
, GridView
y ScrollView
.
Se comporta muy mal con vistas horizontales, como HorizontalScrollView
. Cuando se desplaza hacia la derecha o hacia la izquierda, la vista SwipeRefreshLayout
almacena en caché el toque, evita que HorizontalScrollView
reciba y comienza a desplazarse verticalmente para realizar la actualización.
Intenté resolver este problema, ya que resolví problemas con ScrollView
vertical con ViewPager
interior, utilizando requestDisallowInterceptTouchEvent
pero no funcionó. También noté que este método está anulado en la clase SwipeRefreshLayout
original sin devolver el super. El desarrollador de Google dejó un comentario en su lugar " //Nope.
" //Nope.
:)
Debido a que el componente SwipeRefreshLayout
es relativamente nuevo, no pude encontrar una solución que corrige el problema de desplazamiento horizontal mientras permitía que el deslizamiento refrescara la vista para rastrear y manejar el desplazamiento vertical, así que pensé que compartiría mi solución con la esperanza de evitarle a alguien hora o dos
Si no memoriza el hecho de que ya rechazó el evento ACTION_MOVE, eventualmente lo tomará más tarde si el usuario regresa cerca de su mPrevX inicial.
Solo agrega un booleano para memorizarlo.
public class CustomSwipeToRefresh extends SwipeRefreshLayout {
private int mTouchSlop;
private float mPrevX;
// Indicate if we''ve already declined the move event
private boolean mDeclined;
public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPrevX = MotionEvent.obtain(event).getX();
mDeclined = false; // New action
break;
case MotionEvent.ACTION_MOVE:
final float eventX = event.getX();
float xDiff = Math.abs(eventX - mPrevX);
if (mDeclined || xDiff > mTouchSlop) {
mDeclined = true; // Memorize
return false;
}
}
return super.onInterceptTouchEvent(event);
}
}
Si usa Tim Roes EnhancedListView
Vea estos issues . Fui muy útil para mí porque agregan una función que detecta cuándo comienza el deslizamiento y cuándo termina el deslizamiento.
Cuando comience a deslizar el dedo, desactivo SwipeRefreshLayout y, cuando termine de deslizar el dedo, puedo usar el deslizamientoRefreshLayout.