我已经为我的网格视图实现了一个刷卡刷新布局,如果我向下拉(向下滚动)以调用刷新,它的效果非常好。
但是,我试图弄清楚当用户向上滚动时如何刷新。因此,当用户到达网格中的最后一个项目时(我的限制是10)所以当用户看到所有十个然后向上拉或尝试继续滚动时我该如何刷新?
感谢任何帮助。
答案 0 :(得分:5)
所以人们要么:不知道这个问题的答案,要么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 :(得分:5)
SwipeRefreshLayout不支持从底部提取。 我已经基于原始的SwipeRefreshLayout代码修改了SwipeRefreshLayoutBottom。 它完全基于原始的Google代码,只有坐标反转和新写入的canChildScrollDown方法。所有修改都标记为TODO。
答案 2 :(得分: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);
}});
答案 3 :(得分:3)
如果有人仍然感兴趣的另一个答案。为了在向下滚动时刷新,我在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)以启动效果:< / p>
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);
}
我已经用这个答案知道我什么时候到达列表末尾: