如何在Grid Layout recyclerview中实现无限滚动
How to implement infinite scroll in Gridlayout recylcerview
我需要有关 onscroll 方法的帮助...所以我尝试了一些我在 Whosebug 上发现的东西,但其中大部分都适用于 linearlayout 等。如果你能指出正确的方向,那将非常有帮助...... .
我正在使用 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);
}
});
....
}
无限滚动的逻辑可以在适配器中。像那样:
- Return 适配器中的大小 + 1(用于加载视图)
- 当询问最后一个位置时,return 表示正在加载的视图
- 运行 将下载下一个元素并更改适配器中的数据的后台任务
您也可以在显示最后一个元素之前加载下一个元素。
在OnScrolled.This中添加这个是最基本的idea.You可以根据自己的需要修改
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
}
}
got it right. Better way to handle infinite scrolling is in the adapter.See this answer Sabeer Mohammed。试试这个:
在适配器中创建一个这样的接口
public interface OnLoadMoreListener {
void onLoadMore();
}
在获取数据的activity中实现此接口并覆盖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();
}
但是这个解决方案有一个问题,那就是因为recyclerView已经向下滚动,所以onBindViewHolder()中的条件将始终得到满足,直到手动向上滚动。所以 onLoadMore() 会一直被调用。此外,所有以前的数据都将丢失。
为避免将数据保存在适配器的列表中。尝试这样的事情:
public void setResultList(List<String> resultList) {
this.resultList.addAll(resultList);
notifyDataSetChanged();
}
这里使用 addAll() 将新列表添加到前一个列表中。这不仅会保留以前的数据,还会添加新的数据。
记得在 activity 收到新数据时调用 setResultList()。像这样的东西:(这里我使用的是 Loader)
@Override
public void onLoadFinished(Loader<String> loader, String data) {
if (data != null) {
someAdapter.setResultList(someModel.getResultsList());
}
}
希望对您有所帮助!
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
}
}
});
}
我需要有关 onscroll 方法的帮助...所以我尝试了一些我在 Whosebug 上发现的东西,但其中大部分都适用于 linearlayout 等。如果你能指出正确的方向,那将非常有帮助...... .
我正在使用 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);
}
});
....
}
无限滚动的逻辑可以在适配器中。像那样:
- Return 适配器中的大小 + 1(用于加载视图)
- 当询问最后一个位置时,return 表示正在加载的视图
- 运行 将下载下一个元素并更改适配器中的数据的后台任务
您也可以在显示最后一个元素之前加载下一个元素。
在OnScrolled.This中添加这个是最基本的idea.You可以根据自己的需要修改
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
}
}
在适配器中创建一个这样的接口
public interface OnLoadMoreListener {
void onLoadMore();
}
在获取数据的activity中实现此接口并覆盖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();
}
但是这个解决方案有一个问题,那就是因为recyclerView已经向下滚动,所以onBindViewHolder()中的条件将始终得到满足,直到手动向上滚动。所以 onLoadMore() 会一直被调用。此外,所有以前的数据都将丢失。
为避免将数据保存在适配器的列表中。尝试这样的事情:
public void setResultList(List<String> resultList) {
this.resultList.addAll(resultList);
notifyDataSetChanged();
}
这里使用 addAll() 将新列表添加到前一个列表中。这不仅会保留以前的数据,还会添加新的数据。
记得在 activity 收到新数据时调用 setResultList()。像这样的东西:(这里我使用的是 Loader)
@Override
public void onLoadFinished(Loader<String> loader, String data) {
if (data != null) {
someAdapter.setResultList(someModel.getResultsList());
}
}
希望对您有所帮助!
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
}
}
});
}