下拉android时,SwipeRefreshLayout加载器不会上升

我已经使用了swipeRefreshLayout和recyclerview,它在所有Android版本中运行良好但在Kitkat中我拉下来然后SwipeRefreshLayout加载器不上升并且也不刷新recyclerview数据但是在棒棒糖中工作

我正在使用’com.android.support:support-v4:22.2.1′

编辑1

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 } 

布局代码

          

我之前遇到过同样的问题。 当您没有将RecyclerView作为SwipeRefreshLayout的直接子项时,似乎会发生这种情况。

我们使用像这样的自定义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.FixedSwipeRefreshLayout’,如下所示:

 < ?xml version="1.0" encoding="utf-8"?>  ...  

最后,当您获得SwipeRefreshLayout的句柄时,请使用您的自定义并设置您的RecyclerView:

 FixedSwipeRefreshLayout swipe_refresh; swipe_refresh = (FixedSwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh); RecyclerView mRecyclerView = (RecyclerView) rootView.findViewById(R.id.gv_feeds); swipe_refresh.setRecyclerView(mRecyclerView); 

希望这可以帮助。

根据swipeRefreshDocumentation SwipeRefreshLayout不能很好地与不可滚动的布局(如果在其中添加):你有2个解决方案:

1)更改布局以使swipeRefreshLayout具有direct child作为recyclerView。

像这样的东西:

 < ?xml version="1.0" encoding="utf-8"?>         

2)使用侦听器扩展SwipeRefreshLayout,以便能够从显示此布局的类中添加各种条件。

类似于以下内容:RefreshSwipeRefreshLayout.java

 public class RefreshSwipeRefreshLayout extends SwipeRefreshLayout { private OnChildScrollUpListener mScrollListenerNeeded; public interface OnChildScrollUpListener { boolean canChildScrollUp(); } public RefreshSwipeRefreshLayout(Context context) { super(context); } public RefreshSwipeRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); } /** * Listener that controls if scrolling up is allowed to child views or not */ public void setOnChildScrollUpListener(OnChildScrollUpListener listener) { mScrollListenerNeeded = listener; } @Override public boolean canChildScrollUp() { if (mScrollListenerNeeded == null) { Log.e(GeneralSwipeRefreshLayout.class.getSimpleName(), "listener is not defined!"); } return mScrollListenerNeeded != null && mScrollListenerNeeded.canChildScrollUp(); } } 

然后在显示包含recyclerView布局的SwipeRefreshLayout的类中执行此操作,您可以执行以下操作:

 mSwipeLayout.setOnChildScrollUpListener(new OnChildScrollUpListener() { @Override public boolean canChildScrollUp() { return ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition().getFirstVisiblePosition() > 0 || mRecyclerView.getChildAt(0) == null || mRecyclerView.getChildAt(0).getTop() < 0; } 

});

也别忘了在xml中更改它

你试试这种方式

  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); }}); 

我可能会迟到回答这个但是我遇到了同样的问题,我所做的就是添加:

 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); } });