Android - 使用空textview的SwipeRefreshLayout

厌伴老儒烹瓠叶,强随举子踏槐花。这篇文章主要讲述Android - 使用空textview的SwipeRefreshLayout相关的知识,希望能为你提供帮助。
我已经将SwipeRefreshLayout实现到我的应用程序中,但它只能容纳一个直接的孩子,这应该是listview。我试图找出如何将空文本视图添加到以下工作XML文件:

< android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent" > < ListView android:id="@+id/listViewConversation" android:layout_width="fill_parent" android:layout_height="fill_parent" android:dividerHeight="1dp" /> < /android.support.v4.widget.SwipeRefreshLayout>

将其包装在线性/相对布局中会使其失灵,因为当您想要向下滑动列表视图时,列表视图将始终更新。我能想到的一种方法是以编程方式进行此操作,但我想这不是最好的选择。
您可以使用本教程学习如何实现它:Swipe to refresh GUIDE
所以基本上它一切正常,但我想添加一个空视图,当listview为空时显示一条消息。
答案可能迟到了,但如果你仍然面临这个问题,这是一个干净的解决方案!没有必要创建另一个SwipeRefreshLayout
empty view包裹成ScrollView。将AdapterViewScrollView粘在ViewGroup并将其放入SwipeRefreshLayout
样品:
< android.support.v4.widget.SwipeRefreshLayout android:layout_width="match_parent" android:layout_height="match_parent"> < FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> < ListView android:layout_width="match_parent" android:layout_height="match_parent" /> < ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> < TextView android:layout_width="250dp" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" /> < /ScrollView> < /FrameLayout> < /android.support.v4.widget.SwipeRefreshLayout>

编辑
这是更简单的方法。
检查您的清单是否为空。如果是,那么让它看不见。样品:
if(lst.size() > 0) { mRecyclerView.setVisibility(View.VISIBLE); //set adapter }else { mRecyclerView.setVisibility(View.INVISIBLE); findViewById(R.id.txtNodata).setVisibility(View.VISIBLE); }

这将使mRecyclerView仍然存在,即使没有数据,所有滑动都将正常工作!
另一答案如果您的空视图不需要任何交互,则另一个选项可以很好地工作。例如,它是一个简单的文本视图,说“这里没有数据”。
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > < TextView android:id="@+id/emptyView" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:visibility="visible" android:layout_centerInParent="true" android:text="@string/no_earnable_available" android:textSize="18dp" android:textColor="@color/black" android:background="@color/white" /> < some.app.RecyclerViewSwipeToRefreshLayout android:id="@+id/swipe_refresh_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="4dp" android:background="@android:color/transparent" app:layout_behavior="@string/appbar_scrolling_view_behavior" > < android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" /> < /some.app.RecyclerViewSwipeToRefreshLayout> < /RelativeLayout>

这将空视图放在SwipeToRefreshLayout后面,该视图是透明的,并且还包含透明的RecyclerView。
然后,在代码中,在将项目添加到回收器视图适配器的位置,检查适配器是否为空,如果是,则将空视图的可见性设置为“可见”。反之亦然。
诀窍是视图位于透明回收器视图的后面,这意味着当回收器中没有项目时,回收器视图及其父级SwipeToRefreshLayout将处理滚动。后面的空视图甚至不会被触摸,因此SwipeTorefreshLayout将消耗触摸事件。
自定义RecyclerSwipeTorefreshLayout应以下列方式处理canChildScrollUp方法
@Override public boolean canChildScrollUp() { if (recycler == null) throw new IllegalArgumentException("recycler not set!"); else if (recycler.getAdapter().getItemCount() == 0){ // this check could be done in a more optimised way by setting a flag from the same place where you change the visibility of the empty view return super.canChildScrollUp(); } else { RecyclerView.LayoutManager layoutManager = recycler.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager) { return ((LinearLayoutManager) recycler.getLayoutManager()).findFirstVisibleItemPosition() != 0 || (((LinearLayoutManager) recycler.getLayoutManager()).findFirstVisibleItemPosition() == 0 & & recycler.getChildAt(0) != null & & recycler.getChildAt(0).getY() < 0); //...

这样就可以了。
更新:当然,回收者视图不一定要透明。只有在适配器为空时,才能将透明度更新为活动状态。
干杯!
另一答案这对我来说是一个非常令人沮丧的问题,但经过几个小时的尝试和失败,我想出了这个解决方案。
有了这个我甚至可以刷新空视图(当然还有RecyclerView)
在我的布局文件中,我有这样的结构:
SwipeRefreshLayout FrameLayout RecyclerView my_empty_layout // Doesnt have to be ScrollView it can be whatever ViewGroup you want, I used LinearLayout with a single TextView child

在代码中:
... adapter.notifyDataSetChanged()if (adapter.getItemCount() == 0) { recyclerView.setVisibility(View.GONE); emptyView.setVisibility(View.VISIBLE); } else { recyclerView.setVisibility(View.VISIBLE); emptyView.setVisibility(View.GONE); }

另一答案这对我有用
< FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/lighter_white"> < android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeContainer" android:layout_width="match_parent" android:layout_height="match_parent"> < ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@color/silver" android:layout_marginTop="10dp" android:divider="@android:color/transparent" android:dividerHeight="8dp" android:padding="4dp"/> < /android.support.v4.widget.SwipeRefreshLayout> < TextView android:id="@+id/empty" android:text="@string/strNoRecordsFound" android:layout_width="match_parent" android:layout_height="match_parent" android:textColor="@android:color/black" android:alpha="0.5" android:gravity="center"> < /TextView> < /FrameLayout>

另一答案【Android - 使用空textview的SwipeRefreshLayout】您可能只是在SwipeRefreshLayout中使用NestedScrollView和单个容器。下面是使用mRecyclerView.setNestedScrollingEnabled(false); 的越野车列表
< ?xml version="1.0" encoding="utf-8"?> < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> < !-- some toolbar --> < android.support.v4.widget.SwipeRefreshLayout android:id="@+id/conversationFragment_swipeRefresh" android:layout_alignParentBottom="true" android:layout_below="@+id/some_toolbar" android:layout_width="match_parent" android:layout_height="match_parent"> < android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> < FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> < TextView android:id="@+id/conversationFragment_noResultText" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/FragmentConversations_empty" android:layout_centerHorizontal="true" /> < android.support.v7.widget.RecyclerView android:id="@+id/conversationFragment_recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> < /FrameLa

    推荐阅读