解决ListView与SwipeRefreshLayout滑动冲突的问题
程序员文章站
2022-06-17 18:51:48
...
这个问题呢,在我初次接触SwipeRefreshLayout的时候也遇到过,后来查了相关资料和网络信息,得以解决,今天再次想到了这个问题,就记下来做个备忘吧。
首先说一下使用方式:SwipeRefreshLayout作为官方下拉刷新控件,要将 ListView控件包裹在里面,这样才能在滑动ListView的时候监听到滑动事件进而从顶部调出下拉刷新控件
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/ly_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
然而就是因为这样,才出现了滑动冲突问题,因为一旦启用SwipeRefreshLayout,只要是包裹之内的容器发生下拉动作,就会触发刷新,那样,ListView内容如果大于一屏,滚动到下面就无法回到顶部了,因为滚回顶部需要下拉滑动,就会首先触发SwipeRefreshLayout的下拉事件,尴不尴尬,扎不扎心?
没事,很好解决,直接看代码吧
lv.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
boolean enable = false;
if (lv != null && lv.getChildCount() > 0) {
boolean firstItemVisible = lv.getFirstVisiblePosition() == 0;
boolean topOfFirstItemVisible = lv.getChildAt(0).getTop() == 0;
enable = firstItemVisible && topOfFirstItemVisible;
}
lyRefresh.setEnabled(enable);
}
});
原理很简单,监听ListView的OnScrollListener事件,如果item没有滑到最顶端,就禁用SwipeRefreshLayout,到了顶端以后再启用,就不会产生冲突了
推荐阅读
-
Android ListView与ScrollView冲突的解决方法总结
-
ScrollView与ListView合用(正确计算Listview的高度)的问题解决
-
解决自定义$(id)的方法与jquery选择器$冲突的问题
-
asp.net开发与web标准的冲突问题的一些常见解决方法
-
python3.8与pyinstaller冲突问题的快速解决方法
-
android基础教程之android的listview与edittext冲突解决方法
-
Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法
-
Android ListView与ScrollView冲突的解决方法总结
-
Django与Vue语法的冲突问题完美解决方法
-
php5.3中ZendGuardLoader与wincache冲突问题的解决方法