首页 > 其他分享 >SwipeRefreshLayout和ListView的EmptyView共存冲突的问题

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

时间:2023-04-06 22:44:58浏览次数:52  
标签:ListView color SwipeRefreshLayout EmptyView swipeRefreshLayout listView


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完美添加及完善上拉加载功能



android-Ultra-Pull-To-Refresh 源码解析


http://www.open-open.com/lib/view/open1436405920005.html


标签:ListView,color,SwipeRefreshLayout,EmptyView,swipeRefreshLayout,listView
From: https://blog.51cto.com/u_5454003/6174201

相关文章

  • LoadMoreListView+SwipeRefreshLayout(分页下拉)基本结构
    一切为了快速迭代importjava.util.ArrayList;importorg.json.JSONObject;importandroid.animation.ObjectAnimator;importandroid.os.Bundle;importandroid.support.v4.widget.SwipeRefreshLayout;importandroid.util.Log;importandroid.vie......
  • 关于ListView中使用GestureDetector冲突的解决办法
    在做OnGestureListener手势滑动界面的时候,会遇到这样的问题,就是当界面中含有ListView的时候,OnGestureListener的界面滑动就被ListView拦截并消费掉了。为了解决这个问题需要重写ListView的OnTouchListener接口:ListViewlistView=(ListView)findViewById(R......
  • 上拉下拉刷新,支持ListView,GridView,ScrollView
    开源项目PullToRefresh详解(一)——PullToRefreshListView类似Lollipop滚动溢出效果的下拉刷新布局:JellyRefreshLayouthttp://www.open-open.com/lib/view/open1437223823115.html网上很多这样的效果都是继承某个具体的AdapterView或ScrollView,这样很不通......
  • Listview中显示不同的视图布局
    1.使用场景在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能。convertView在Item为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题。比如有些行为纯文本,有些行则是......
  • 横向滑动的ListView
    我通常把GridView设置成1行来代替横向的listview了,呵呵。下面这个类留着以后试试。publicclassHorizontalListViewextendsAdapterView<ListAdapter>{publicbooleanmAlwaysOverrideTouch=true;protectedListAdaptermAdapter;privateint......
  • 运用手势操作ListView中的Item
    如下面这个图:需要实现的功能是:用手指在某条记录上从左往右划一下,出现一条横线,用于表示这个菜已经上过了;倒过来划,取消这条横线,表示这个菜没上过。如何实现呢?看我的吧!首先需要一个Item的布局,在布局的最上方有一个ImageView用于显示这条横线,如果没有就把这个I......
  • 分别设置listview加载中、空数据、加载数据失败三种状态的显示
    设置listview加载中,空数据,加载数据失败三种状态的显示.基本用法:importjava.util.ArrayList;importjava.util.Arrays;importcom.kanak.emptylayout.EmptyLayout;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnCl......
  • 在ListView上滑动显示Delete按钮
    SwipeLayout实现listview滑动删除功能http://www.devstore.cn/code/info/579.html首先设置listView.setOnTouchListener(onTouchListener);listView=(ListView)findViewById(R.id.listView);listView.setOnItemClickListener(onItemClickListener);li......
  • ListView之setEmptyView的问题
    使用listView或者gridView时,当列表为空时,有时需要显示一个特殊的emptyview来提示用户,一般情况下,如果你是继承ListActivity,只要<ListViewandroid:id="@id/android:list".../><TextViewandroid:id="@id/android:empty.../>当列表为空时就会自动显示Tex......
  • <Android> ListView 列表控件的使用-李国庆-专题视频课程
    ListView列表控件的使用—15573人已学习课程介绍        1,ListView介绍;2,原理讲解;3,简单实现;4,ListView扩展;课程收益    通过学习本课程,具有一定的Android开发技能和知识,熟练掌握这一专题中集成组件与布局属性、实现listview基本用法,及简单扩展。讲师介绍    ......