with setcolorschemecolors recyclerview pullrefresh example ejemplo android horizontalscrollview swiperefreshlayout

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.