Reputation: 5637
Is it possible ?? as a Title said
swipe down to refresh Layout but stick the Layout not move it down along swipe gusture
Thank you - I'm using SwipeRefreshLayout
Upvotes: 11
Views: 36997
Reputation: 4109
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);
}
});
Upvotes: 4
Reputation: 1811
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...
Upvotes: 0
Reputation: 10717
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
Upvotes: 23
Reputation: 5637
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
STEP 2: COPY following java class to your project src
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
STEP 4: UPDATE LAYOUT use
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
}
Upvotes: 12
Reputation: 6305
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.
Upvotes: 4