我需要onscroll方法的帮助......所以我尝试了一些我在stackoverflow上找到的东西,但是大多数都适用于linearlayout等。如果你能指出我正确的方向,那将是非常有用的...... / p>
我使用instagram api加载图片。它一次发送20张图片,所以当我到达页面底部时我需要加载更多图片
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
//configViews();
// mLayoutManager = new GridLayoutManager(this, 2);
// mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
....
}
答案 0 :(得分:6)
在OnScrolled中添加。这是基本的想法。您可以根据您的要求修改它
if(dy > 0){ // only when scrolling up
final int visibleThreshold = 2;
GridLayoutManager layoutManager = (GridLayoutManager)recyclerview.getLayoutManager();
int lastItem = layoutManager.findLastCompletelyVisibleItemPosition();
int currentTotalCount = layoutManager.getItemCount();
if(currentTotalCount <= lastItem + visibleThreshold){
//show your loading view
// load content in background
}
}
答案 1 :(得分:0)
无限滚动的逻辑可以在适配器中。像那样:
您也可以在显示最后一个元素之前加载下一个元素。
答案 2 :(得分:0)
Kevin Robatel做对了。处理无限滚动的更好方法是在适配器中。参见这个答案Sabeer Mohammed。试试这个:
在适配器中创建一个接口
public interface OnLoadMoreListener {
void onLoadMore();
}
在获取数据的活动中实现此接口并覆盖onLoadMore()。
@Override
public void onLoadMore() {
//fetch data here
}
返回onBindViewHolder()中的适配器。写下这个条件。
// this checks that the last item in the recyclerView has been reached
// if so, calls onLoadMore()
if ((position >= getItemCount() - 1)) {
loadMoreListener.onLoadMore();
}
但是这个解决方案存在问题,因为recyclelerView已经向下滚动,因此onBindViewHolder()中的条件将始终满足,直到手动向上滚动。因此onLoadMore()将继续被调用。此外,以前的所有数据都将丢失。
为避免将数据保存在适配器的List中。尝试这样的事情:
public void setResultList(List<String> resultList) {
this.resultList.addAll(resultList);
notifyDataSetChanged();
}
这里使用addAll()将新List添加到上一个List。这不仅会保留以前的数据,还会添加新的数据。
请记住在接收新数据时在活动中调用setResultList()。这样的事情:(我在这里使用装载机)
@Override
public void onLoadFinished(Loader<String> loader, String data) {
if (data != null) {
someAdapter.setResultList(someModel.getResultsList());
}
}
希望这有帮助!
答案 3 :(得分:0)
boolean is_loading = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.your_layout);
super.onCreate(savedInstanceState);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
final int visibleThreshold = 2;
GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
int lastItem = layoutManager.findLastCompletelyVisibleItemPosition();
int currentTotalCount = layoutManager.getItemCount();
if (currentTotalCount <= lastItem + visibleThreshold && is_loading == false) {
is_loading = true;
//Put you code here
}
}
});
}