有可能吗?正如标题所说
向下滑动以刷新布局,但坚持布局不要沿着滑动gusture向下移动
谢谢 - 我正在使用SwipeRefreshLayout
答案 0 :(得分:23)
你试试这种方式
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
,则此代码不起作用答案 1 :(得分:12)
在我的反复试验之后,我找到了一个
的解决方案http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/
对于可以实现SwipeRefreshLayout的人来说,实现它
第1步:下载来自github的android-support v4(开源)
第2步: COPY 跟随项目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
}
答案 2 :(得分:4)
感谢 Jongz Puangput 的解决方法,但我想提出另一个解决方案,我觉得更简单。
为了防止SwipeRefreshLayout的子项下拉,您可以使用覆盖offsetTopAndBottom
方法提供自己的子视图,如下所示:
public class FixedRelativeLayout extends RelativeLayout {
...
@Override
public void offsetTopAndBottom(int offset) {
// Ignoring movement from SwipeRefreshLayout
super.offsetTopAndBottom(0);
}
}
这对我有用,希望它对任何人都有帮助。
答案 3 :(得分:4)
我也面临同样的问题。试试这个:
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 :(得分: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处理刷新事件...