wake-up-neo.com

SwipeRefreshLayout - Wischen Sie nach unten, um die Ansicht zu aktualisieren, ohne die Ansicht zu verschieben

Ist es möglich ?? wie ein Titel sagte

wischen Sie nach unten, um das Layout zu aktualisieren, aber kleben Sie das Layout nicht entlang der Wischbewegung entlang.

Danke - Ich verwende SwipeRefreshLayout

11
Jongz Puangput

Nach meinem Ausprobieren fand ich eine Lösung von

http://www.dailydevbook.de/Android-swiperefreshlayout-ohne-overrolls/

Für Leute, die SwipeRefreshLayout implementieren können, um dies zu erreichen


SCHRITT 1: DOWNLOAD Android-Unterstützung v4 (Open Source) von github

SCHRITT 2: COPY nach der Java-Klasse in Ihrem Projekt-Quellcode

  • SwipeRefreshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

note1- (Um SwipeRefreshLayout in mySwipeRefreshLayout umzuwandeln, um eine Verwechslung mit dem Original zu vermeiden.).

SCHRITT 3: UPDATE CODE verwenden 

  • mySwipeRefreshLayout anstelle von 
  • SwipeRefreshLayout

SCHRITT 4: UPDATE LAYOUT verwenden

  • com.yourpackage.mySwipeRefreshLaout anstelle von 
  • Android.support.v4.widget.SwipeRefreshLayout

SCHRITT 5: find und ändere in mySwipeRefreshLayout.Java in einen folgenden Code

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
    }
12
Jongz Puangput

Sie versuchen es auf diese Weise

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);
}});

Dieser Code funktioniert nicht, wenn listView über paddingTop verfügt

23
Cabezas

Dank an Jongz Puangput für den Workaround, aber ich möchte eine andere Lösung vorschlagen, die ich einfacher finde.

Um zu verhindern, dass das untergeordnete Element des SwipeRefreshLayout-Objekts heruntergezogen wird, können Sie Ihre eigene untergeordnete Ansicht mit der überschreibenden offsetTopAndBottom-Methode wie folgt versehen:

public class FixedRelativeLayout extends RelativeLayout {

    ...

    @Override
    public void offsetTopAndBottom(int offset) {
        // Ignoring movement from SwipeRefreshLayout
        super.offsetTopAndBottom(0);
    }

}

Das klappt für mich, hoffe es hilft jedem.

4
Alex Vasilkov

Ich stand auch vor demselben Problem. Versuche dies:

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);
    }
});
4
Noman

Sie können die Recycler-Ansicht herausfinden, die sich gerade oben befindet. Wenn Sie wissen, dass Sie SwipeRefreshLayout deaktivieren oder aktivieren können, geben Sie mir ein Beispiel

angenommen, Sie verwenden einen linearen Layout-Manager oder ein Raster, dann können Sie die Position des Recyclers von dort aus ermitteln

        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);
        }

damit funktioniert die Schriftrolle für den Recycler einwandfrei und wenn er die Spitze erreicht, behandelt swipeRefreshLayout das Aktualisierungsereignis ...

0