我已經爲我的網格視圖實施了刷卡刷新佈局,如果向下拉(滾動)以便刷新被調用,它將完美工作。Android輕掃刷新佈局向上滾動以刷新
但是,我想弄清楚當用戶向上滾動時如何刷新。所以當用戶到達網格中最後一個項目時(我的限制爲10),所以當用戶看到全部十個,然後向上拉或試圖繼續滾動時,我怎麼才能刷新?
任何幫助表示讚賞。
我已經爲我的網格視圖實施了刷卡刷新佈局,如果向下拉(滾動)以便刷新被調用,它將完美工作。Android輕掃刷新佈局向上滾動以刷新
但是,我想弄清楚當用戶向上滾動時如何刷新。所以當用戶到達網格中最後一個項目時(我的限制爲10),所以當用戶看到全部十個,然後向上拉或試圖繼續滾動時,我怎麼才能刷新?
任何幫助表示讚賞。
所以人們要麼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();
}
}
});
你試試這樣
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);
}});
見我的答案在stackoverflow
SwipeRefreshLayout從Android的支持庫版本21不從底部支持上拉。 我已經基於原始的SwipeRefreshLayout代碼對SwipeRefreshLayoutBottom進行了修改。 它完全基於原始的Google代碼,只是座標反轉和新編寫的canChildScrollDown方法。所有修改都標記爲TODO。
,如果有人仍有意另一個答案。爲了在向下滾動時刷新,我已經在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);
}
我用這個答案,知道什麼時候我得該列表的末尾:
嘿@ DJ鬥,我只是想複製這種行爲時遇到了問題。我使用http://nlopez.io/swiperefreshlayout-with-listview-done-right/修復了我的gridview的早期刷新,但是我無法計算列表底部的位置。你可以用你如何計算底部來編輯你的答案嗎?謝謝! –