刷卡不起作用,列表视图是SwipeRefreshlayout的唯一子项。如何解决这个问题?
答案 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)
我也有这个问题,并通过使用下面的布局解决了在活动中没有任何其他代码。
如果您正在使用ListActivity
或ListFragment
,它会为您显示/隐藏空视图,并使用此布局结构刷新空列表。
不需要黑客,所有内容都在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)
您可以查看此问题。我发布了一个解决方案。
答案 5 :(得分:1)
答案 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_parent
,SwipeRefresh
的身高为wrap_content
。当列表中有项目时,请不要忘记创建文本gone
。
答案 7 :(得分:0)
我曾经尝试过UI hack,但是没有用,唯一可行的解决方案是set adapter。 传递空值,确保该值不会为空。
NotificationListAdapter notificationListAdapter;
notificationListAdapter = new NotificationListAdapter(mContext,notificationResponse);
reCycleViewNotificationList.setAdapter(notificationListAdapter); // weather ListView or RecyclerView