Evitar SwipeRefresh mientras se está acelerando en android
Tengo un ListView
tiene fastScroll
siempre habilitado y la implementación de SwipeRefresh
. Cuando deslizo la lista hacia abajo, actualiza la lista. Mi problema es fastScroll
. Si la lista tiene su primer elemento visible o decir en su parte superior inicial, entonces si desplaza el fastScrollThumb
hacia abajo, hace que el efecto de desplazamiento no se desplace hacia abajo. ¿Hay de fastScrollThumb
manera / solución que si fastScrollThumb
el fastScrollThumb
, entonces no debería hacer Swipe
actualizar efecto en lugar de que debe desplazarse hacia abajo como comportamiento natural.
- Android scrolllist alfabético rápido en RecyclerView con la barra de herramientas Collapsing
- Añadir desplazamiento rápido a una lista de desplazamiento AlertDialog.Builder
- ¿Cómo utilizar desplazamiento rápido en android?
- Holo rápido desplazamiento ver en los dispositivos antiguos
- Android L: Desplazamiento rápido para el RecyclerView
EDITADO Mi XML Layout
es el siguiente:
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:id="@+id/buttons_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="10dp"> <ImageView android:id="@+id/SubmitButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/neoo_tab_selector" /> </RelativeLayout> <ListView android:id="@id/android:list" style="@style/NeeoContactListView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/buttons_layout" android:layout_marginTop="10dp" /> </RelativeLayout> </android.support.v4.widget.SwipeRefreshLayout>
My Logic for onScroll
para habilitar / deshabilitar el SwipeRefresh
es:
getListView().setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { boolean enable = false; if(getListView() != null && getListView().getChildCount() > 0){ // check if the first item of the list is visible boolean firstItemVisible = getListView().getFirstVisiblePosition() == 0; // check if the top of the first item is visible boolean topOfFirstItemVisible = getListView().getChildAt(0).getTop() == 0; // enabling or disabling the refresh layout enable = firstItemVisible && topOfFirstItemVisible; } if(enable){ enableSwipe(); }else{ disableSwipe(); } } });
- Cómo personalizar la carta de vista previa de desplazamiento rápido
- ¿Cómo activar el desplazamiento rápido (pulgar) en el menú desplegable de Android Spinner?
- Modificar la burbuja alfabética de desplazamiento rápido
- Cómo detectar si un ListView se desplaza rápidamente
- Android ListView desplazamiento rápido con secciones: texto de sección demasiado largo
- Cómo agregar un scroller rápido al RecyclerView
- Android fastScroll sólo cubre parte de la lista
- ¿Cómo manejar el scroller rápido en Lollipop 5.1?
Acabo de mirar en la documentación de la SwipeRefreshLayout
y creo que mencionan lo que está buscando:
… Si el oyente determina que no debe haber una actualización, debe llamar a
setRefreshing(false)
para cancelar cualquier indicación visual de una actualización. Si una actividad desea mostrar sólo la animación de progreso, debe llamar asetRefreshing(true)
. Para desactivar la animación de gestos y progresos, llame asetEnabled(false)
en la vista.
Así que tienes algunas opciones, primero intentaría jugar con setEnabled()
o setRefreshing()
, pero para usar correctamente esos métodos primero debemos ser capaces de detectar si el ListView
es desplazamiento rápido. ¡No hay ningún oyente o cualquier cosa para el desplazamiento rápido pero usted puede conseguir el estado con la reflexión! Sobre la base de esta excelente y seriamente subestimado respuesta he escrito un FastScrollListener
que se puede utilizar como un OnScrollListener
:
this.listView.setFastScrollEnabled(true); this.listView.setOnScrollListener(new FastScrollListener(this.listView) { @Override protected void onFastScrollStateChanged(AbsListView view, FastScrollState state) { // This line disabled the SwipeRefreshLayout // whenever the user is fast scrolling swipeRefreshLayout.setEnabled(state != FastScrollState.DRAGGING); } @Override protected void onFastScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
También puede intentar llamar setRefreshing()
lugar de setEnabled()
si setEnabled()
no funciona.
Y aquí está el código del FastScrollListener
:
public abstract class FastScrollListener implements AbsListView.OnScrollListener { private final int STATE_DRAGGING; private final int STATE_VISIBLE; private final int STATE_NONE; public enum FastScrollState { DRAGGING, VISIBLE, NONE, UNKNOWN } private FastScrollState fastScrollState = FastScrollState.UNKNOWN; private Field stateField; private Object mFastScroller; public FastScrollListener(AbsListView listView) { try { final Field fastScrollerField = AbsListView.class.getDeclaredField("mFastScroller"); fastScrollerField.setAccessible(true); mFastScroller = fastScrollerField.get(listView); final Field stateDraggingField = mFastScroller.getClass().getDeclaredField("STATE_DRAGGING"); stateDraggingField.setAccessible(true); STATE_DRAGGING = stateDraggingField.getInt(mFastScroller); final Field stateVisibleField = mFastScroller.getClass().getDeclaredField("STATE_VISIBLE"); stateVisibleField.setAccessible(true); STATE_VISIBLE = stateVisibleField.getInt(mFastScroller); final Field stateNoneField = mFastScroller.getClass().getDeclaredField("STATE_NONE"); stateNoneField.setAccessible(true); STATE_NONE = stateNoneField.getInt(mFastScroller); stateField = mFastScroller.getClass().getDeclaredField("mState"); stateField.setAccessible(true); fastScrollState = getFastScrollState(); } catch (NoSuchFieldException e) { throw new IllegalStateException("Could not find required fields for fast scroll detection!", e); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not find required fields for fast scroll detection!", e); } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { updateFastScrollState(view); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { updateFastScrollState(view); updateFastScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } private void updateFastScrollState(AbsListView view) { if (stateField != null) { final FastScrollState state = getFastScrollState(); if (fastScrollState != state) { fastScrollState = state; onFastScrollStateChanged(view, state); } } } private void updateFastScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(fastScrollState == FastScrollState.DRAGGING) { onFastScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } } private FastScrollState getFastScrollState() { try { final int state = stateField.getInt(mFastScroller); if (state == STATE_DRAGGING) { return FastScrollState.DRAGGING; } if (state == STATE_VISIBLE) { return FastScrollState.VISIBLE; } if (state == STATE_NONE) { return FastScrollState.NONE; } return FastScrollState.UNKNOWN; } catch (IllegalAccessException e) { throw new IllegalStateException("Could not read fast scroll state!", e); } } protected abstract void onFastScrollStateChanged(AbsListView view, FastScrollState state); protected abstract void onFastScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount); }
¡Espero poder ayudarle y si usted tiene alguna otra pregunta por favor no dude en preguntar!
EDIT: Pruebe esto, pero dudo que funcione:
@Override protected void onFastScrollStateChanged(AbsListView view, FastScrollState state) { boolean enable = false; if (getListView().getChildCount() > 0) { boolean firstItemVisible = getListView().getFirstVisiblePosition() == 0; boolean topOfFirstItemVisible = getListView().getChildAt(0).getTop() == 0; enable = firstItemVisible && topOfFirstItemVisible; } refreshLayout.setEnabled(enable); }