SwipeRefreshLayout和ListView的EmptyView共存冲突的问题

2023-05-16

转载自: 点击打开链接
SwipeRefreshLayout是android官方的下拉刷新控件;
它内部有且只能有一个子控件;
当一个ListView嵌入到它内部时,就不能为ListView带一个EmptyView了;
于是很自然的想到将ListView和EmptyView纳入到一个父控件中;
典型的像下面这样的布局:

<android.support.v4.widget.SwipeRefreshLayout  
        android:id="@+id/swipeRefreshLayout"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent" >  
  
        <FrameLayout  
            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:cacheColorHint="@android:color/transparent"  
                android:divider="@color/text_color_c4"  
                android:dividerHeight="@dimen/line_width"  
                android:footerDividersEnabled="true" />  
  
            <include  
                android:id="@+id/emptyView"  
                layout="@layout/empty_view_for_tang_friend_0" />  
        </FrameLayout>  
    </android.support.v4.widget.SwipeRefreshLayout>

这样就可以实现ListView和EmptyView都下拉刷新了;
但是问题来了,当ListView的数据超过一屏的时候,再往上滑,滑不上去了;
这就是SwipeRefreshLayout和ListView的EmptyView共存冲突的问题(如果SwipeRefreshLayout中仅有一个ListView的话没问题,但现在多了一个EmptyView);

解决办法有是有,虽然不那么优雅:

    swipeRefreshLayout = (android.support.v4.widget.SwipeRefreshLayout) v.findViewById(R.id.swipeRefreshLayout);  
                    swipeRefreshLayout.setColorSchemeResources(R.color.text_color_c6, R.color.yellow, R.color.grey, R.color.red);  
                    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()  
                    {  
      
                        @Override  
                        public void onRefresh()  
                        {  
                            // TODO Auto-generated method stub  
                            //dosomething  
                        }  
                    });  
    listView = (ListView) v.findViewById(R.id.listView);  
                    listView.setOnScrollListener(new AbsListView.OnScrollListener()  
                    {  
                        @Override  
                        public void onScrollStateChanged(AbsListView absListView, int i)  
                        {  
                        }  
      
                        @Override  
                        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount)  
                        {  
                            if (firstVisibleItem == 0)  
                                swipeRefreshLayout.setEnabled(true);  
                            else  
                                swipeRefreshLayout.setEnabled(false);  
                        }  
                    });  

在ListView滑动的时候做一个判断,看看是不是滑动到顶部了,到顶部了就swipeRefreshLayout.setEnabled(true);让SwipeRefreshLayout可以接受动作,这样就ok了。


上面的解决方案比较简单,但是有个小问题,就是当listView滑动到第一个Item(让第一个Item显示一半)的时候,再上滑就上不去了,始终显示半个Item。
为了解决这个问题,只能使用笨办法了:将ListView和EmptyView分离,让他们两个分别被两个SwipeRefreshLayout包裹,如下面的布局:

    <?xml version="1.0" encoding="utf-8"?>  
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent" >  
      
        <android.support.v4.widget.SwipeRefreshLayout  
            android:id="@+id/swipeRefreshLayout"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent" >  
      
            <cn.tangdada.tangbang.widget.LoadMoreListView  
                android:id="@+id/listView"  
                android:layout_width="match_parent"  
                android:layout_height="match_parent"  
                android:cacheColorHint="@android:color/transparent"  
                android:divider="@color/text_color_c4"  
                android:dividerHeight="@dimen/line_width"  
                android:footerDividersEnabled="false" />  
        </android.support.v4.widget.SwipeRefreshLayout>  
      
        <android.support.v4.widget.SwipeRefreshLayout  
            android:id="@+id/swipeRefreshLayoutEmptyView"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:visibility="gone" >  
      
            <TextView  
                android:layout_width="match_parent"  
                android:layout_height="match_parent"  
                android:gravity="center"  
                android:paddingLeft="32dp"  
                android:paddingRight="32dp"  
                android:text="@string/empty"  
                android:textColor="@color/text_color_c3"  
                android:textSize="@dimen/font_big" />  
        </android.support.v4.widget.SwipeRefreshLayout>  
      
    </FrameLayout>  

然后需要在代码中控制显示EmptyView的时机,比如我这里的:

    private void updateViews(Object obj)  
        {  
            ArrayList<User> list = (ArrayList<User>) obj;  
            if (list.size() == 0)  
            {  
                //listView.removeLoadMoreListener();  
            }  
      
            users.addAll(list);  
      
            if (users.size() == 0)  
            {  
                swipeRefreshLayout.setVisibility(View.GONE);  
                swipeRefreshLayout.setRefreshing(false);  
                swipeRefreshLayoutEmptyView.setVisibility(View.VISIBLE);  
                swipeRefreshLayoutEmptyView.setRefreshing(false);  
            }  
            else  
            {  
                //listView.onLoadMoreComplete();  
                swipeRefreshLayout.setVisibility(View.VISIBLE);  
                swipeRefreshLayout.setRefreshing(false);  
                swipeRefreshLayoutEmptyView.setVisibility(View.GONE);  
                swipeRefreshLayoutEmptyView.setRefreshing(false);  
            }  
      
            notifyDataSetChanged();  
        }  


SwipeRefreshLayout完美添加及完善上拉加载功能
http://blog.csdn.net/ljx19900116/article/details/41806863

android-Ultra-Pull-To-Refresh 源码解析
http://www.open-open.com/lib/view/open1436405920005.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwipeRefreshLayout和ListView的EmptyView共存冲突的问题 的相关文章

  • 最长公共子序列(LCS)

    最长公共子序列LCS问题 给定2个序列X和Y xff0c 当另一序列Z既是X的子序列又是Y的子序列时 xff0c 称Z是序列X和Y的公共子序列 给定X 61 x1 x2 xm 和Y 61 y1 y2 yn xff0c 请找出X和Y的最长公共
  • 0-1背包问题

    0 1背包问题 甲欲出去旅游 xff0c 可携带20 公斤的行李 xff0c 已知甲想带的 5 件行李的重量及其在旅行中产生的效益如下表所示 xff1a 行李编号 I II III IV V 重量 千克 6 4 8 8 4 行李效益 8 4
  • 旅行售货员问题

    旅行售货员问题 题目 某售货员要到4 个城市去推销商品 xff0c 已知各城市之间的路程 xff0c 如右图所示 请问他应该如何选定一条从城市 1 出发 xff0c 经过每个城市一遍 xff0c 最后回到城市 1 的路线 xff0c 使得总
  • https网页加载http资源时不显示图片,报错解决方案

    https网页加载http资源时不显示图片 xff0c 报错解决方案 自动将http的不安全请求升级为https静态文件放置本地反向代理请求http资源 加载http资源时会报错 xff1a 自动将http的不安全请求升级为https 页面
  • 数独游戏

    数独游戏 题目 九宫格是在81个格子 9 9 中 xff0c 要满足以下条件 xff1a xff08 1 xff09 每个横行和竖列中的9个格子都包含数字1 xff5e 9 xff0c 且不重复 xff1b xff08 2 xff09 每个
  • 静态内部类和普通内部类

    两种内部类 Java的内部类有两种 xff0c 一种是静态内部类 xff0c 另一种是普通内部类 xff0c 普通内部类可以获得外部对象的引用 xff0c 所以在普通内部类能够访问外部对象的成员变量 xff0c 也就能够使用外部类的资源 x
  • 迷宫老鼠游戏

    迷宫老鼠游戏 题目 以一个m n的长方阵表示迷宫 xff0c 0 和 1 分别表示迷宫中的通路和障碍 请设计一个算法 xff0c 对任意设定的迷宫 xff0c 求出一条从入口到出口的通路 xff0c 或得出没有通路的结论 xff1b 如果有
  • java通过JDBC链接SQLServer2012

    下面请一字一句地看 xff0c 一遍就设置成功 xff0c 比你设置几十遍失败 xff0c 费时会少得多 首先 xff0c 在连接数据库之前必须保证SQL Server 2012是采用SQL Server身份验证方式而不是windows身份
  • 完整java开发中JDBC连接数据库代码和步骤

    转载自 xff1a Hongten JDBC连接数据库 创建一个以JDBC连接数据库的程序 xff0c 包含7 个步骤 xff1a 1 加载JDBC驱动程序 xff1a 在连接数据库之前 xff0c 首先要加载想要连接的数据库的驱动到JVM
  • 浅析网站 APP 登录界面设计

    无论网页或是移动APP的设计 xff0c 很重要的一点是如何能在小而美和功能复杂性之间找到平衡点 本文就移动APP表单设计进行浅析 xff0c 看设计师是如何在设计与交互体验之间做到小而美的平衡 一 极致的减法 这是一个异于常规设计思路而得
  • Android应用开发EditText文本内容变化监听方法

    package com google import android app Activity import android os Bundle import android text Editable import android text
  • Android背景渐变色(shape,gradient)

    转载自 xff1a http l62s iteye com blog 1659433 Android设置背景 色可以通过在res drawable里定义一个xml 如下 xff1a 代码 xml代码 xff1a lt xml version
  • Android 自定义CheckBox 样式

    转载自 xff1a http www open open com lib view open1392187282067 html 有些时候需要根据项目需求自定义CheckBox 的样式 xff0c 步骤如下 xff1a 1 首先在drawa
  • 定制个性化的 Android Checkbox 图标

    首发来自 http blog csdn net garretly 转载注明出处 先大概说一下 这里用到的技术比较简单没有多大的技术含量 关键是大家如何去理解 以及自我更新 好了 这里上代码 在 工程目录下 gt res gt drawabl
  • 解决ssl connect error问题

    curl版本过低 xff0c 升级curl php重新编译 xff0c 指定curl库解决
  • RadioGroup以及RadioButton自定义样式的使用

    转载自 xff1a RadioGroup以及RadioButton自定义样式的使用 RadioButton从字面上就可以很清楚的知道它是单选按钮 xff0c 它与RadioGroup配套时候 通常我们在开发中需要自定义RadioButton
  • 两种方式实现类似qq搜索的切换

    转载自 xff1a 点击打开链接 http www csdn net tag searchview qq的搜索功能在点击搜索框时整个页面上移 xff0c 出现透明布局 该效果是模仿iOS实现的 xff0c 但是在Android也是很容易实现
  • android---xml---include用法(导入另一个XML文件到本布局中)

    转载自 xff1a 点击打开链接 Android在xml文件中可使用include包含其他定义好的布局 xff0c 可以将多处用到的布局单独出来 xff0c 然后用include包含进来 xff0c 这种包含方法相当于把原来布局的一部分代码
  • Android开发技巧之像QQ一样输入文字和表情图像

    转载自 xff1a 点击打开链接 QQ聊天输入框 xff0c 在输入框中可以同时输入文字和表情图像 实际上 xff0c 这种效果在Android SDK中只需要几行代码就可以实现 本文将会介绍如何实现像QQ一样输入表情图像 EditText
  • Android调用相机并将照片存储到sd卡上

    转载自 xff1a 点击打开链接 Android中实现拍照有两种方法 xff0c 一种是调用系统自带的相机 xff0c 然后使用其返回的照片数据 还有一种是自己用Camera类和其他相关类实现相机功能 xff0c 这种方法定制度比较高 xf

随机推荐