Android支持v4 SwipeRefreshLayout空视图问题

时间:2014-04-09 10:01:45

标签: android android-layout swiperefreshlayout

在为listview设置空视图后,

刷卡不起作用,列表视图是SwipeRefreshlayout的唯一子项。如何解决这个问题?

8 个答案:

答案 0 :(得分:21)

以下是解决方案: 您只需使用此视图层次结构:

    <FrameLayout ...>

        <android.support.v4.widget.SwipeRefreshLayout ...>

            <ListView
                android:id="@android:id/list" ... />
        </android.support.v4.widget.SwipeRefreshLayout>

        <TextView
            android:id="@android:id/empty" ...
            android:text="@string/empty_list"/>
    </FrameLayout>

然后,在代码中,您只需调用:

_listView.setEmptyView(findViewById(android.R.id.empty));

就是这样。

答案 1 :(得分:4)

我也有这个问题,并通过使用下面的布局解决了在活动中没有任何其他代码

如果您正在使用ListActivityListFragment,它会为您显示/隐藏空视图,并使用此布局结构刷新空列表。

不需要黑客,所有内容都在SwipeRefreshLayout中,应该是。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/Refresher"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@null" />
        <ScrollView
            android:id="@android:id/empty"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:text="Geen formulieren gevonden"
                style="@style/text.EmptyView" />
        </ScrollView>
    </LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout>

希望这会对你有所帮助。如果是这样,请不要忘记接受答案。

注意:这是my answer to this question的副本,但这个问题几乎与此问题重复......:)

<强>更新
如果过早激活SwipeRefreshLayout,您可以使用以下命令实现ListView.OnScroll:

_refresher.Enabled = e.FirstVisibleItem == 0;

这将禁用刷新,直到您滚动到顶部。只有在使用ListView时才需要这个,新的RecyclerView按预期工作。

答案 2 :(得分:3)

对我来说问题是,当空视图可见时,尽管刷新方法有效,但未显示刷新圆圈。对我来说这个代码有用,我希望它有所帮助。

  • xml布局:

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true">
    
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fadingEdge="none"
            android:footerDividersEnabled="false"
            android:headerDividersEnabled="false"/>
    
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center">
    
            <TextView
                android:id="@+id/empty_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:gravity="center"
                android:visibility="gone"/>
        </ScrollView>
    </FrameLayout>
    

  • 自定义SwipeRefreshLayout:

    package misc;
    
    import android.content.Context;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.widget.ListView;
    
    public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {
        private ListView mListView;
    
        public CustomSwipeRefreshLayout(Context context) {
            super(context);
        }
    
        public void setListView(ListView listView) {
            mListView = listView;
        }
    
        @Override
        public boolean canChildScrollUp() {
            if (mListView == null) {
                return true;
            }
    
            return mListView.canScrollVertically(-1);
        }
    }
    
  • 在我使用布局的片段中,我只是通过这种方式将滑动设置为刷新布局:

    mSwipeRefreshLayout.setListView(mListView);
    
  • ListView的空视图以这种方式设置:

    TextView emptyView = (TextView) view.findViewById(R.id.empty_view);
    emptyView.setText("No data");
    mListView.setEmptyView(emptyView);
    

我希望它有所帮助。

答案 3 :(得分:2)

这是我如何做到这一点(可能不是非常优雅的解决方案)

private void createEmptyView() {
    ViewGroup parent = (ViewGroup) listView.getParent();
    emptyView = (TextView) getLayoutInflater(null)
            .inflate(R.layout.view_empty, parent, false);
    parent.addView(emptyView);
    listView.setEmptyView(emptyView);
}

public class FrameSwipeRefreshLayout extends SwipeRefreshLayout {

    private ViewGroup listView;
    public void setListView(ViewGroup list) {
        listView = list;
    }

    @Override
    public boolean canChildScrollUp() {
        if (listView != null) {
            View child = listView.getChildAt(0);
            return child != null && child.getTop() != 0;
        }
        return super.canChildScrollUp();
    }
}

空布局

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center_horizontal"
      android:clickable="true" />

列表布局

    <FrameSwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >
        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
        </FrameLayout>
    </FrameSwipeRefreshLayout>

答案 4 :(得分:1)

您可以查看此问题。我发布了一个解决方案。

Android - SwipeRefreshLayout with empty textview

答案 5 :(得分:1)

我使用两个SwipeToRefreshLayouts解决了这个问题。

  • 一个用于包装ListView
  • 另一个为emptyView

我在GitHub上发布了我的代码。

答案 6 :(得分:0)

正如上面写的@Dinesh,我使用了clickable="true",如下所示,空RecyclerView

mRecyclerView.setVisibility(View.VISIBLE);
mRecyclerView.setClickable(true);
myText.setVisibility(View.VISIBLE);

xml layout:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshKartvizitKisilerim"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </android.support.v4.widget.SwipeRefreshLayout>


    <TextView
        android:id="@+id/myText"
        android:visibility="gone"
        android:text="@string/noListItem"
        android:textSize="18sp"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

RecyclerView的身高为match_parentSwipeRefresh的身高为wrap_content。当列表中有项目时,请不要忘记创建文本gone

答案 7 :(得分:0)

我曾经尝试过UI hack,但是没有用,唯一可行的解​​决方案是set adapter。 传递空值,确保该值不会为空。

NotificationListAdapter notificationListAdapter;
notificationListAdapter = new NotificationListAdapter(mContext,notificationResponse);
reCycleViewNotificationList.setAdapter(notificationListAdapter); // weather ListView or RecyclerView