【问题标题】:Android Swipe Refresh Layout scroll up to refreshAndroid Swipe Refresh Layout 向上滚动刷新
【发布时间】:2014-09-08 05:33:39
【问题描述】:

我已经为我的网格视图实现了滑动刷新布局,如果我向下拉(滚动)以调用刷新,它可以完美地工作。

但是,我试图弄清楚当用户向上滚动时如何刷新。因此,当用户到达网格中的最后一个项目时(我的限制是 10 个),当用户看到所有 10 个项目然后向上拉或尝试继续滚动时,我该如何刷新?

感谢任何帮助。

【问题讨论】:

    标签: android swiperefreshlayout


    【解决方案1】:

    stackoverflow查看我的回答

    Android 支持库版本 21 中的 SwipeRefreshLayout 不支持从底部拉取。 我已经根据原始 SwipeRefreshLayout 代码进行了修改 SwipeRefreshLayoutBottom 。 它完全基于原始的 Google 代码,只需反转坐标和新编写的 canChildScrollDown 方法。所有修改都标记为 TODO。

    Bitbucker repository

    【讨论】:

      【解决方案2】:

      所以人们要么 a:不知道这个问题的答案,要么 b:他们不愿意分享知识。

      无论如何,经过很长时间,我想出了自己的解决方案。我在我的网格中添加了一个滚动侦听器,并在我滚动到屏幕底部时进行了计算,此时我从滑动中回忆了 onRefresh() 方法以刷新...

      编辑 添加更多信息

      因此,在我进行了一些研究以计算用户何时到达网格视图的底部之后,我遵循了诸如 this 之类的问题以及其他问题来得到它。下面是我的代码,我必须修改它才能使其与本机刷新功能一起使用。我的改变是为了防止不断刷新。所以在我的 if 语句中包含一个检查它当前没有刷新,所以当我到达底部时它刷新了,但我没有那个检查,所以它不断刷新。然后我必须检查网格中的项目总数,因为当用户到达最后一个项目(最后一个项目)时,应用程序也不断刷新,没有什么可以打破循环。希望这对您有所帮助...

              worldBeersGrid.setOnScrollListener(new AbsListView.OnScrollListener() {
              @Override
              public void onScrollStateChanged(AbsListView absListView, int i) {
      
              }
              @Override
              public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
      
                  int position = firstVisibleItem+visibleItemCount;
                  int limit = totalItemCount;
                  int totalItems = sharedpreferences.getInt("WORLD ITEM COUNT", 0);
      
                  Log.i("TOTAL WORLD ITEMS", String.valueOf(totalItems));
                  Log.i("LIMIT :::::::::::: ", String.valueOf(limit));
                  Log.i("POSITION ::::::::::::", String.valueOf(position));
                  Log.i("REFRESHING :::::::::::::::", String.valueOf(swipeRefreshLayout.isRefreshing()));
      
                  if(position>=limit && totalItemCount>0 && !swipeRefreshLayout.isRefreshing() && position <totalItems){
                      swipeRefreshLayout.setRefreshing(true);
                      //In the below method I made my call to my ws...
                      onRefresh();
                  }
              }
          });
      

      【讨论】:

      • 嘿@DJ-DOO,我刚刚尝试复制这种行为并且遇到了麻烦。我使用nlopez.io/swiperefreshlayout-with-listview-done-right 修复了我的gridview 上的早期刷新,但我在计算列表底部的位置时遇到了麻烦。你能用你如何计算底部来编辑你的答案吗?谢谢!
      【解决方案3】:

      你试试这个方法

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

      【讨论】:

        【解决方案4】:

        如果有人仍然感兴趣,请提供另一个答案。为了在向下滚动时刷新,我在 swipeRefreshLayout 上实现了 onRefreshListerner()。

            swipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.swipe_messages);
            swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    swipeRefreshLayout.setRefreshing(true);
        
                    ( new Handler()).postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            refresh();
                        }
                    }, 1000);
                }
            });
        

        但是为了在向上滚动并且仅在到达列表末尾时刷新,我在列表上实现了 OnTouchListener(),其中包括 swipeRefreshLayout.setRefreshing(true) 以启动效果:

            listView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == android.view.MotionEvent.ACTION_UP) {
        
                        if (listView.getLastVisiblePosition() == listView.getAdapter().getCount() -1 &&
                                listView.getChildAt(listView.getChildCount() - 1).getBottom() <= listView.getHeight())
                        {
        
                            swipeRefreshLayout.setRefreshing(true);
        
                            ( new Handler()).postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    refresh();
                                }
                            }, 1000);
        
                        }
                    }
                    return false;
                }
            });
        

        当然,您必须在更新列表后禁用 swipeRefreshLayout:

        public void refresh (){
            //Do something neat here to refresh your list
            swipeRefreshLayout.setRefreshing(false);
        }
        

        我已经使用这个答案来知道我何时到达列表的末尾:

        https://stackoverflow.com/a/10235887/6144027

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-09
          • 2018-12-16
          • 1970-01-01
          • 1970-01-01
          • 2017-11-18
          相关资源
          最近更新 更多