SwipeRefreshLayout 与ListView滑动冲突的解决

原创 2015年11月18日 10:13:20

SwipeRefreshLayout 与ListView滑动冲突问题

在SwipeRefreshLayout控件中,只能够放ListView或者LinearLayout单一控件,当SwipeRefreshLayout中放两个或多个并列布局时,就会出现滑动冲突问题:

  1. 如下布局,就会出现冲突问题,当向下滑动ListView时,SwipeRefreshLayout会优先获取事件。导致ListView不能够正常下拉。
<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swip_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/white"
                android:gravity="center_vertical"
                android:orientation="vertical"
                android:paddingBottom="9dp"
                android:paddingTop="9dp" >



                <View
                    android:id="@+id/view1"
                    android:layout_width="fill_parent"
                    android:layout_height="50dip"
                    android:layout_marginLeft="15dp"
                    android:layout_marginRight="15dp"
                    android:layout_marginTop="10dp"
                    android:background="@color/home_fenge_line" />

                </LinearLayout>
            </LinearLayout>

            <ImageView
                android:id="@+id/iv_sawtooth"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/buy_list_details_sawtooth"
                android:contentDescription="@string/image_content" />

            <ListView
                android:id="@+id/lv_list"
                style="@style/pulltorefreshDividerListview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >
            </ListView>
        </LinearLayout>
    </android.support.v4.widget.SwipeRefreshLayout>

怎么解决呢???
分析可以得到,有与SwipeRefreshLayout已经封装了方法,我们可以利用已有的方法来解决滑动冲突:
思路如下:判断ListView是否滑动到第一条数据,如果是,则SwipeRefreshLayout才获取事件(能够下拉刷新)。反之,让ListView 获取事件。那么我们可以实现让ListView OnScrollListener接口,在OnScroll和onScrollStateChanged两个方法中做出相应的判断:
ok,思路已经有了,代码如下:

@Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        this.lastItem = firstVisibleItem + visibleItemCount;
        this.totalItem = totalItemCount;
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (this.totalItem == lastItem && scrollState == SCROLL_STATE_IDLE) {
            Log.v("isLoading", "yes");
            if (!isLoading) {
                isLoading = true;
                footer.setVisibility(View.VISIBLE);
                onLoadMore.loadMore();//上拉加载
            }
        }
        //判断ListView是否滑动到第一个Item的顶部
        if (isValid!=null&&this.getChildCount() > 0 && this.getFirstVisiblePosition() == 0
                && this.getChildAt(0).getTop() >= this.getPaddingTop()) {
            //解决滑动冲突,当滑动到第一个item,下拉刷新才起作用
            isValid.setSwipeEnabledTrue();
        } else {
            isValid.setSwipeEnabledFalse();
        }
    }

ok,我们只需写个接口,给Swipe回调就行:

public interface OnSwipeIsValid{
        public void setSwipeEnabledTrue();
        public void setSwipeEnabledFalse();
    }

实现接口:

lvList.setSwipeIsVaildListenr(this);//ListView设置实现接口

    @Override
    public void setSwipeEnabledTrue() {
        swipe.setEnabled(true);//让swipe起作用,能够刷新
    }

    @Override
    public void setSwipeEnabledFalse() {
        swipe.setEnabled(false);//让swipe不能够刷新
    }

ok,分析完成。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

SwipeRefreshLayout的事件处理

SwipeRefreshLayout事件处理分析

java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams cannot be cast to android.widg

如果你要将一个view添加到另一个布局中,你必须设定该View的布局参数为其父类所使用的布局参数类型。即要在代码中动态改变某组件的高度,其布局参数类型应该是其父类所使用的布局参数类型.

异常 java.lang.ClassCastException:cannot be cast to android.widget.HeaderViewListAdapter.的解决方法

今天,后台开发人员小凡同学测试出了我写的一个页面的bug,这个页面很简单,就是listView加载数据,除了正常的创建adapter和listView设置adapter简单的操作外,我还用到了list...

cannot be cast to android.widget.HeaderViewListAdapter

页面listview根本没用headerview,但是报了这个错误: exception=java.lang.ClassCastException: com.zkrkj.peoplehospital...

Android:SwipeRefreshLayout和ViewPager滑动冲突的原因和正确的解决方式

一、前言急着解决问题的直接看博文的最后面吧,或者点这里跳转过去,正确的解决方式就在那。虽然SwipeRefreshLayout出来已经很久了,但是知道今天我才第一次使用。 然后发现两个问题: 1....

Android SwipeRefreshLayout 、RecyclerView冲突下拉冲突的解决方案

SwipeRefreshLayout和RecyclerView一起使用的时候,有时出现RecyclerView没有滑动到顶部,手指向下滑动时,触发了SwipeRefreshLayout的刷新事件,造成...

解决listview与SwipeRefreshLayout滑动冲突问题

listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(Ab...

Android中SwipeRefreshLayout和listview的冲突解决办法

SwipeRefreshLayout和listview的冲突解决办法        在google放出了SwipeRefreshLayout之后,就再也不用辛辛苦苦的用上百行代码来实现下拉刷新了(...

下拉刷新与上拉更多(用SwipeRefreshLayout和ListView实现)

SwipeRefreshLayout是Google在support v4 19.1版本的library更新的一个下拉刷新组件,实现刷新效果更方便。 1:在布局中添加SwipeRefreshLayo...
  • pengkv
  • pengkv
  • 2015-04-03 09:17
  • 5477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)