android - recyclerview - SwipeRefreshLayout: desliza hacia abajo para actualizar pero no para mover la vista hacia abajo
refresh layout android studio (5)
Después de mi prueba y error, encontré una solución de
http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/
Para las personas que pueden implementar SwipeRefreshLayout, para lograrlo
PASO 1: DESCARGAR android-support v4 (Open Source) de github
PASO 2: COPIA siguiente clase java a su proyecto src
- SwipeRefreshLayout
- SwipeProgressBar
- BakedBezierInterpolator
note1- (Refactor SwipeRefreshLayout a mySwipeRefreshLayout para evitar confusiones con el original) note2- (Corrige estas clases y utiliza el origen entre ellos en lugar de v4)
PASO 3: CÓDIGO DE ACTUALIZACIÓN uso
- mySwipeRefreshLayout en lugar de
- SwipeRefreshLayout
PASO 4: USO DE LA DISPOSICIÓN DE ACTUALIZACIÓN
- com.yourpackage.mySwipeRefreshLaout en lugar de
- android.support.v4.widget.SwipeRefreshLayout
PASO 5: en su mySwipeRefreshLayout.java, busque y cambie a un código siguiente
private void updateContentOffsetTop ( int targetTop) {
final int currentTop = mTarget.getTop ();
if (targetTop> mDistanceToTriggerSync) {
targetTop = ( int ) mDistanceToTriggerSync;
} else if (targetTop < 0 ) {
targetTop = 0 ;
}
// SetTargetOffsetTopAndBottom (targetTop - currentTop);
setTargetOffsetTopAndBottom ( 0 ); // MOD: Prevent Scroll Down Animation
}
Es posible ?? como un título dijo
deslícese hacia abajo para actualizar el diseño pero pegue el diseño no lo mueva hacia abajo a lo largo de la ráfaga de deslizamiento
Gracias, estoy usando SwipeRefreshLayout
Gracias a Jongz Puangput por la solución alternativa, pero quiero sugerir otra solución, que me parece más simple.
Para evitar el desplegable del elemento secundario de SwipeRefreshLayout, puede proporcionar su propia vista secundaria con el método offsetTopAndBottom
modificado de la offsetTopAndBottom
manera:
public class FixedRelativeLayout extends RelativeLayout {
...
@Override
public void offsetTopAndBottom(int offset) {
// Ignoring movement from SwipeRefreshLayout
super.offsetTopAndBottom(0);
}
}
Eso funciona para mí, espero que ayude a cualquiera.
Lo intentas de esta manera
listView.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(listView != null && listView.getChildCount() > 0){
// check if the first item of the list is visible
boolean firstItemVisible = listView.getFirstVisiblePosition() == 0;
// check if the top of the first item is visible
boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0;
// enabling or disabling the refresh layout
enable = firstItemVisible && topOfFirstItemVisible;
}
swipeRefreshLayout.setEnabled(enable);
}});
Este código no funciona si listView tiene paddingTop
Puede encontrar la vista de reciclador actualmente en la parte superior y sabiendo que puede deshabilitar o habilitar SwipeRefreshLayout, permítame dar un ejemplo
digamos que usa el administrador de disposición lineal o la cuadrícula, entonces puede averiguar la posición del reciclador desde allí
LinearLayoutManager mLayoutManager;
if (mColumnCount <= 1) {
mLayoutManager = new LinearLayoutManager(getBaseContext());
} else {
mLayoutManager = new GridLayoutManager(getBaseContext(), mColumnCount);
}
recyclerAdapter = new RecyclerViewAdapter(allData);
mRecycler.setAdapter(recyclerAdapter);
mRecycler.setLayoutManager(layoutManager);
if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
swipeRefreshLayout.setEnabled(true);
}
else{
swipeRefreshLayout.setEnabled(false);
}
para que su rollo de reciclador funcione bien y si llega a la cima, swipeRefreshLayout maneja el evento de actualización ...
Yo también estaba enfrentando el mismo problema. prueba esto:
guidesList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int topRowVerticalPosition = (guidesList == null ||
guidesList.getChildCount() == 0) ? 0 : guidesList.getChildAt(0).getTop();
swipeContainer.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0);
}
});