拉下android时,SwipeRefreshLayout加载程序不会上升
我使用了SwipeRefreshLayout和recyclerview,它在所有android版本中都可以正常工作,但在Kitkat中,当我下拉SwipeRefreshLayout加载程序时,它不会上升,也不会刷新recyclerview数据,但在棒棒糖中工作 我正在使用'com.android.support:support-v4:22.2.1' 编辑1拉下android时,SwipeRefreshLayout加载程序不会上升,android,android-recyclerview,swiperefreshlayout,Android,Android Recyclerview,Swiperefreshlayout,我使用了SwipeRefreshLayout和recyclerview,它在所有android版本中都可以正常工作,但在Kitkat中,当我下拉SwipeRefreshLayout加载程序时,它不会上升,也不会刷新recyclerview数据,但在棒棒糖中工作 我正在使用'com.android.support:support-v4:22.2.1' 编辑1 SwipeRefreshLayout swipe_refresh; swipe_refresh = (SwipeRefreshLayout)
SwipeRefreshLayout swipe_refresh;
swipe_refresh = (SwipeRefreshLayout)rootView.findViewById(R.id.swipe_refresh);
swipe_refresh.post(new Runnable() {
@Override
public void run() {
swipe_refresh.setRefreshing(true);
}
});
swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// Loading more data..
.....
....
getData();
}
});
swipe_refresh.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
public void getData(){
// Load data from web service...
...
...
...
// After loading
swipe_refresh.setRefreshing(false);
// Set data to adapter
}
布局代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@color/grey_100">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/gv_feeds"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9"
android:scrollbars="vertical"/>
<ProgressBar
android:id="@+id/prog_load_more"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:visibility="gone"/>
</LinearLayout>
</FrameLayout>
</android.support.v4.widget.SwipeRefreshLayout>
您可以这样尝试
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
boolean enable = false;
if(listView != null && listView.getChildCount() > 0){
// check if the first item of the list is visible
boolean firstItemVisible = listView.getFirstVisiblePosition() == 0;
// check if the top of the first item is visible
boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0;
// enabling or disabling the refresh layout
enable = firstItemVisible && topOfFirstItemVisible;
}
swipeRefreshLayout.setEnabled(enable);
}});
我以前也有过同样的问题。当您没有将RecyclerView作为SwipeRefreshLayout的直接子视图时,似乎会发生这种情况 我们通过使用如下自定义布局解决了此问题:
public class FixedSwipeRefreshLayout extends SwipeRefreshLayout {
private RecyclerView recyclerView;
public FixedSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FixedSwipeRefreshLayout(Context context) {
super(context);
}
public void setRecyclerView(RecyclerView recyclerView) {
this.recyclerView = recyclerView;
}
@Override
public boolean canChildScrollUp() {
if (recyclerView!=null) {
return recyclerView.canScrollVertically(-1);
}
return false;
}
}
然后,不要使用android.support.v4.widget.SwipeRefreshLayout而是使用您自己的“com.example.app.fixedswiperfreshlayout”,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<com.example.app.FixedSwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</com.example.app.FixedSwipeRefreshLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:id="@+id/ll_HeaderProgress"
android:background="@color/white_color_30">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_buzz"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
</android.support.v4.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/ll_footerProgress"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:visibility="gone"/>
</LinearLayout>
</FrameLayout>
mSwipeLayout.setOnChildScrollUpListener(new OnChildScrollUpListener() {
@Override
public boolean canChildScrollUp() {
return ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition().getFirstVisiblePosition() > 0 ||
mRecyclerView.getChildAt(0) == null ||
mRecyclerView.getChildAt(0).getTop() < 0;
}
希望这有帮助。根据SwiperFreshLayout文档,SwiperFreshLayout不能很好地处理添加到其中的不可滚动布局: 您有两种解决方案: 1) 更改布局以使swipeRefreshLayout具有直接子级作为recyclerView 大概是这样的:
<?xml version="1.0" encoding="utf-8"?>
<com.example.app.FixedSwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</com.example.app.FixedSwipeRefreshLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:id="@+id/ll_HeaderProgress"
android:background="@color/white_color_30">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_buzz"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
</android.support.v4.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/ll_footerProgress"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:visibility="gone"/>
</LinearLayout>
</FrameLayout>
mSwipeLayout.setOnChildScrollUpListener(new OnChildScrollUpListener() {
@Override
public boolean canChildScrollUp() {
return ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition().getFirstVisiblePosition() > 0 ||
mRecyclerView.getChildAt(0) == null ||
mRecyclerView.getChildAt(0).getTop() < 0;
}
然后在显示包含recyclerView布局的SwipeRefreshLayout的类中执行此操作,您可以执行以下操作:
<?xml version="1.0" encoding="utf-8"?>
<com.example.app.FixedSwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</com.example.app.FixedSwipeRefreshLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:id="@+id/ll_HeaderProgress"
android:background="@color/white_color_30">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_buzz"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
</android.support.v4.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/ll_footerProgress"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:visibility="gone"/>
</LinearLayout>
</FrameLayout>
mSwipeLayout.setOnChildScrollUpListener(new OnChildScrollUpListener() {
@Override
public boolean canChildScrollUp() {
return ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition().getFirstVisiblePosition() > 0 ||
mRecyclerView.getChildAt(0) == null ||
mRecyclerView.getChildAt(0).getTop() < 0;
}
mSwipeLayout.setOnChildScrollUpListener(新的OnChildScrollUpListener(){
@凌驾
公共布尔值canChildScrollUp(){
return((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition().getFirstVisiblePosition()>0 |
mRecyclerView.getChildAt(0)=null | |
mRecyclerView.getChildAt(0.getTop()<0;
}
}))
另外,别忘了在xml中更改它,我回答这个问题可能会迟到,但我遇到了同样的问题,我所做的只是补充:
swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// Loading more data..
.....
....
getData();
//make sure to set it to false as this will be set it to true when onRefresh is triggered
swipe_refresh.setRefreshing(false);
}
});
是否调用swipeRefreshLayout.setRefreshing(false);数据加载完成时?是的,我是。。当我再次下拉刷新,然后它卡在屏幕上,我可以拖动它…你能附加代码吗?代码似乎是好的。即使请求失败,您是否调用setRefreshing(false)?现在有同样的问题。你能找到解决办法吗?