是否可以 ??正如标题所说
向下滑动以刷新布局,但坚持布局而不是沿着滑动手势向下移动
谢谢 - 我正在使用 SwipeRefreshLayout
是否可以 ??正如标题所说
向下滑动以刷新布局,但坚持布局而不是沿着滑动手势向下移动
谢谢 - 我正在使用 SwipeRefreshLayout
你试试这个方法
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);
}});
如果 listView 具有 paddingTop,则此代码不起作用
经过反复试验,我找到了一种解决方案
http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/
对于可以实现 SwipeRefreshLayout 的人,为了实现它
第 1 步:从 github下载android-support v4(开源)
第 2 步:将以下 java 类复制到您的项目 src
note1-(将 SwipeRefreshLayout 重构为 mySwipeRefreshLayout 以防止与原始混淆) note2-(修复这些类并使用彼此的源而不是 v4)
第 3 步:更新代码使用
第 4 步:更新布局使用
第 5 步:在您的 mySwipeRefreshLayout.java 中,找到并更改为以下代码
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
}
感谢Jongz Puangput的解决方法,但我想提出另一种解决方案,我觉得它更简单。
为了防止下拉 SwipeRefreshLayout 的子视图,您可以为自己的子视图提供覆盖offsetTopAndBottom
方法,如下所示:
public class FixedRelativeLayout extends RelativeLayout {
...
@Override
public void offsetTopAndBottom(int offset) {
// Ignoring movement from SwipeRefreshLayout
super.offsetTopAndBottom(0);
}
}
这对我有用,希望它会帮助任何人。
我也面临同样的问题。试试这个:
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);
}
});
您可以在顶部找到当前的回收器视图,并且知道您可以禁用或启用 SwipeRefreshLayout,让我举个例子
假设您使用线性布局管理器或网格,那么您可以从那里找到回收站的位置
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);
}
所以你的回收器滚动将正常工作,如果到达顶部 swipeRefreshLayout 处理刷新事件......