Android 下拉刷新与 ListView冲突问题

来源:互联网 发布:mac mpv可以加字幕吗 编辑:程序博客网 时间:2024/05/07 02:07

当我们使用RefreshLayout嵌套ListView进行下拉刷新时,有时候会出现listview可以上拉到底,但是下拉时就会进行刷新操作,而不是滑动listview了。

出现这种问题的原因是在RefreshLayout控件中,只能够放ListView或者LinearLayout单一控件,当RefreshLayout中放两个或多个并列布局时,就会出现滑动冲突问题。
如下布局:

<com.test.custompulltorefresh.RefreshLayout        android:id="@+id/refreshLayout"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="#303030">        <LinearLayout            android:layout_width="match_parent"            android:layout_height="match_parent">            <ListView                android:id="@+id/listView"                android:background="@android:color/background_light"                android:layout_width="match_parent"                android:layout_height="match_parent">            </ListView>        </LinearLayout>    </com.test.custompulltorefresh.RefreshLayout>

因为Listview外部还包这一层LinearLayout,所以就会出现以上这种情况。

那么怎么解决这种呢,就是根据RefreshLayout已经封装的方法,给listview设置setOnScrollListener,重写它的两个方法,

@Override    public void onScrollStateChanged(AbsListView view, int scrollState) {        Log.e(TAG, "onScrollStateChanged");        //判断ListView是否滑动到第一个Item的顶部        if (view.getChildCount() > 0 && view.getFirstVisiblePosition() == 0                && view.getChildAt(0).getTop() >= view.getPaddingTop()) {            //解决滑动冲突,当滑动到第一个item,下拉刷新才起作用            refreshLayout.setEnabled(true);        } else {            refreshLayout.setEnabled(false);        }    }    @Override    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {    }

这样就可以避免以上的冲突问题。

涉及到的事件处理问题请右转:
Android触摸事件传递机制
Android事件拦截机制

另附代码Demo,稍微修改就可以。Demo

如有不对或不明白的地方请批评指正,共同交流学习。

原创粉丝点击