2014-07-17 95 views
5

我已經爲我的網格視圖實施了刷卡刷新佈局,如果向下拉(滾動)以便刷新被調用,它將完美工作。Android輕掃刷新佈局向上滾動以刷新

但是,我想弄清楚當用戶向上滾動時如何刷新。所以當用戶到達網格中最後一個項目時(我的限制爲10),所以當用戶看到全部十個,然後向上拉或試圖繼續滾動時,我怎麼才能刷新?

任何幫助表示讚賞。

回答

5

所以人們要麼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(); 
      } 
     } 
    }); 
+1

嘿@ DJ鬥,我只是想複製這種行爲時遇到了問題。我使用http://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); 
}}); 
5

見我的答案在stackoverflow

SwipeRefreshLayout從Android的支持庫版本21不從底部支持上拉。 我已經基於原始的SwipeRefreshLayout代碼對SwipeRefreshLayoutBottom進行了修改。 它完全基於原始的Google代碼,只是座標反轉和新編寫的canChildScrollDown方法。所有修改都標記爲TODO。

Bitbucker repository

2

,如果有人仍有意另一個答案。爲了在向下滾動時刷新,我已經在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); 
     } 
    }); 

但爲了向上滾動時刷新,只有當我到了列表的末尾,我已經包括了swipeRefreshLayout名單上實現OnTouchListener()。setRefreshing(真)開始生效:

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