SwipeRefreshLayout – swipe down to refresh but not move the view pull down

Is it possible ?? as a Title said

swipe down to refresh Layout but stick the Layout not move it down along swipe gusture

  • How to close the activity from the service?
  • Android: 2 relative layout divided in half screen
  • Deal with inactive wi-fi networks
  • Android Google Maps API v2 display route
  • In-App Billing Security and Design questions
  • Permission to write to the SD card
  • Thank you – I’m using SwipeRefreshLayout

  • Upload large file in Android without outofmemory error
  • How send http request in android app to access REST API
  • android assetManager
  • Bitmap.Config.HARDWARE vs Bitmap.Config.RGB_565
  • Dropdown Spinner outside of actionbar? (IceCream Sandwich style, w/ActionBarSherlock)
  • Android GridView draw dividers
  • 5 Solutions collect form web for “SwipeRefreshLayout – swipe down to refresh but not move the view pull down”

    You try this way

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

    This code doesn’t work if listView has paddingTop

    After my trial and error, I found one solution from

    http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/

    For people who can implement SwipeRefreshLayout, in order to achieve it


    STEP 1: DOWNLOAD android-support v4 (Open Source) from github

    • android-support v4 – Download Link

    STEP 2: COPY following java class to your project src

    • SwipeRefreshLayout
    • SwipeProgressBar
    • BakedBezierInterpolator

    note1- (Refactor SwipeRefreshLayout to mySwipeRefreshLayout to prevent confusing with original)
    note2- (Fix these classes and use the source from each other instead of v4)

    STEP 3: UPDATE CODE use

    • mySwipeRefreshLayout instead of
    • SwipeRefreshLayout

    STEP 4: UPDATE LAYOUT use

    • com.yourpackage.mySwipeRefreshLaout instead of
    • android.support.v4.widget.SwipeRefreshLayout

    STEP 5: In your mySwipeRefreshLayout.java, find and change to a following 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
        }
    

    Thanks to Jongz Puangput for the workaround, but I want to suggest another solution, that I find simplier.

    In order to prevent pull down of the SwipeRefreshLayout’s child you can provide your own child view with overriden offsetTopAndBottom method like this:

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

    That works for me, hope it’ll help anybody.

    I was also facing same issue. try this:

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

    You can find out the recycler view currently at the top and by knowing that you can disable or enable SwipeRefreshLayout, let me give an example

    let’s say you use linear layout manager or grid then you can find out the recycler position from there

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

    so your recycler scroll will work fine and if reach the top the swipeRefreshLayout handle the refresh event…

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.