Android 如何使用StaggeredLayoutManager实现无止境滚动
我已经尝试为LinearLayoutManager实现无休止的滚动,并且成功地将LinearLayoutManager实现复制到StaggedGridLayoutManager,但没有成功 我只想拿到第一件可以看到的东西 在LinearLayoutManager中:Android 如何使用StaggeredLayoutManager实现无止境滚动,android,android-recyclerview,endlessscroll,staggeredgridlayout,Android,Android Recyclerview,Endlessscroll,Staggeredgridlayout,我已经尝试为LinearLayoutManager实现无休止的滚动,并且成功地将LinearLayoutManager实现复制到StaggedGridLayoutManager,但没有成功 我只想拿到第一件可以看到的东西 在LinearLayoutManager中: int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(int); 但实际上,LayoutManager是: int firstVisible
int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(int);
但实际上,LayoutManager是:
int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(int[])
如何使用(int)而不是(int[])获取第一个VisibleItem
这方面有什么好的方法/实施吗
提前谢谢 我让它工作了:
int mSpanCount = 2;
int[] into = new int[mSpanCount];
int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(into)[0];
您可以在StaggedGridLayoutManager中使用以下两种方法之一:
传递一个空的int数组,该数组将使用位置进行初始化,并使用对您有意义的数组
private boolean loading = true;
private int pastVisibleItems, visibleItemCount, totalItemCount;
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener({
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
int[] firstVisibleItems = null;
firstVisibleItems = mLayoutManager.findFirstVisibleItemPositions(firstVisibleItems);
if(firstVisibleItems != null && firstVisibleItems.length > 0) {
pastVisibleItems = firstVisibleItems[0];
}
if (loading) {
if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
loading = false;
Log.d("tag", "LOAD NEXT ITEM");
}
}
}
});
要实现EndlessRecyclerOnScrollListener,首先创建EndlessRecyclerOnScrollListener java类
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {
public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();
private int scrolledDistance = 0;
private boolean controlsVisible = false;
private boolean loading = true; // True if we are still waiting for the last set of data to load.
private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
private int pastVisibleItems, visibleItemCount, totalItemCount;
private int current_page = 1;
private StaggeredGridLayoutManager mStaggeredGridLayoutManager;
public EndlessRecyclerOnScrollListener(StaggeredGridLayoutManager staggeredGridLayoutManager) {
this.mStaggeredGridLayoutManager = staggeredGridLayoutManager;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mStaggeredGridLayoutManager.getItemCount();
//firstVisibleItem = mStaggeredGridLayoutManager.findFirstVisibleItemPosition();
int[] firstVisibleItems = null;
firstVisibleItems = mStaggeredGridLayoutManager.findFirstVisibleItemPositions(firstVisibleItems);
if (firstVisibleItems != null && firstVisibleItems.length > 0) {
pastVisibleItems = firstVisibleItems[0];
}
if (loading) {
if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount)
<= (pastVisibleItems + visibleThreshold)) {
// End has been reached
// Do something
current_page++;
onLoadMore(current_page);
loading = true;
}
if (scrolledDistance > 1 && controlsVisible) {
controlsVisible = false;
scrolledDistance = 0;
} else if (scrolledDistance < -1 && !controlsVisible) {
controlsVisible = true;
scrolledDistance = 0;
}
if ((controlsVisible && dy > 0) || (!controlsVisible && dy < 0)) {
scrolledDistance += dy;
}
}
public abstract void onLoadMore(int current_page);
;
}
这是我的
滚动监听器的实现
下面是我实现ScrollListener的代码:
private endlesscrollstener滚动监听器滚动监听器=
新建EndlessScrollListener(新建EndlessScrollListener.RefreshList(){
@重写公共void onRefresh(int pageNumber){
//在这里,您可以执行服务器连接或任何其他操作,以更新数据并显示回收器视图
//注意:这是同步方法
}
});
addOnScrollListener(scrollListener);
自定义ScrollListener
类:
class EndlessScrollListener扩展了RecyclerView.OnScrollListener{
私有布尔孤岛加载;
私人网页;
私有int pageNumber=0;
私人刷新列表刷新列表;
私有布尔是反擦痕;
私人物品;
公共EndlessScrollListener(刷新列表刷新列表){
this.isLoading=false;
this.hasMorePages=true;
this.refreshList=刷新列表;
}
@覆盖已克隆的公共void(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
StaggedGridLayoutManager经理=
(StaggedGridLayoutManager)recyclerView.getLayoutManager();
int visibleItemCount=manager.getChildCount();
int totalItemCount=manager.getItemCount();
int[]firstVisibleItems=manager.findFirstVisibleItemPositions(null);
if(firstVisibleItems!=null&&firstVisibleItems.length>0){
pastVisibleItems=firstVisibleItems[0];
}
如果((visibleItemCount+pastVisibleItems)>=totalItemCount&&!isLoading){
isLoading=true;
如果(hasMorePages&!isRefreshing){
isRefreshing=真;
new Handler().postDelayed(new Runnable()){
@重写公共无效运行(){
refreshList.onRefresh(页码);
}
}, 200);
}
}否则{
isLoading=false;
}
}
公共无效名称页(){
this.hasMorePages=false;
}
公共页{
isRefreshing=假;
页码=页码+1;
}
公共接口刷新列表{
void onRefresh(int页码);
}
}
非常感谢您提供此解决方案。它工作得很好,我想。实际上,在更新后的AppCompactLibrary中,他们有一些方法可以做到这一点。但由于某些原因,我无法更新库。所以我被卡住了。你的回答给了我适当的解决办法。非常感谢。是否刷新始终为真,此方法必须是公共的,并在“onRefresh”@PabloCegarra中调用。请您再解释一次好吗?我不明白你什么意思?监听器的主要思想是让开发人员知道用户何时触到列表的末尾。因此,他在“onRefresh()”中得到了这个事件。或者我错了吗?是的,它对我来说就像一个符咒,但是这个例子很混乱,因为notifyMorePages不公开它在工作,但是EndlessScrollListener构造函数和RefreshList不公开这就是为什么我面临这个问题,我在Kotlin中使用它,当我滚动它不工作时,它只在初始化时工作一次,你知道吗,我做错了什么。我在哪里通知更多页面。@farhana我已经使用此代码加载下一部分数据(这是很久以前的事了),现在我又在使用一个很好的解决方案
RecyclerView mRecyclerView;
StaggeredGridLayoutManager mStaggeredGridLayoutManager;
private RecyclerView.Adapter adapter;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState) {
View v = inflater.inflate(R.layout.notices_layout, container, false);
mRecyclerView = (RecyclerView) v.findViewById(R.id.listaNoticias);
mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(
2, //number of grid columns
GridLayoutManager.VERTICAL);
//Sets the gap handling strategy for StaggeredGridLayoutManager
mStaggeredGridLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
mRecyclerView.setLayoutManager(mStaggeredGridLayoutManager);
//initializing our adapter
adapter = new MyAdapter(list, getContext());
//Adding adapter to recyclerview
mRecyclerView.setAdapter(adapter);
mRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(mStaggeredGridLayoutManager) {
@Override
public void onLoadMore(int current_page) {
// do something...
getData(current_page);
}
});
return v;
}