厌伴老儒烹瓠叶,强随举子踏槐花。这篇文章主要讲述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
。将AdapterView
和ScrollView
粘在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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何根据android视图中的可见内容调整大小()
- Android ViewPager,ListFragments以及更新列表中的元素时更新
- 需要Android数据库帮助
- 如何将ListView标题放入Android泡泡中
- Android ListView ContextMenu
- 我可以在通用Android应用程序中使用WearableListView吗()
- 如何在Android中的ListView中突出显示行()
- Android ScrollView中的VerticalScrollExtent是什么()
- 如何在xamarin native android中的listview中为项目着色