gpt4 book ai didi

android - Recyclerview StaggeredGridLayoutManager - 查找最后一个可见项目

转载 作者:行者123 更新时间:2023-11-29 17:01:09 31 4
gpt4 key购买 nike

我正在使用带有 StaggeredGridLayoutManager 和 Endless Scroll 的 Recyclerview。当列表的最后一项对用户可见时,我想进行网络调用。所以这是我的代码:

   public RecyclerViewAdapter(Context context) {

Log.d(Const.DEBUG, "RecyclerViewAdapter Constructor()");

this.context = context;

final StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) recyclerView.getLayoutManager();

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);

totalItemCount = staggeredGridLayoutManager.getItemCount();
lastVisibleItems = staggeredGridLayoutManager.findLastVisibleItemPositions(new int[mStaggeredLayoutManager.getSpanCount()]);

Log.d(Const.DEBUG, "LastVisibleItems: " + Arrays.toString(lastVisibleItems));
Log.d(Const.DEBUG, "LastVisibleItems Count: " + lastVisibleItems.length);

if (staggeredGridLayoutManager.getSpanCount() == 1) {
lastVisibleItem = lastVisibleItems[0];
} else if (staggeredGridLayoutManager.getSpanCount() == 2) {
lastVisibleItem = Math.max(lastVisibleItems[0], lastVisibleItems[1]);
} else if (staggeredGridLayoutManager.getSpanCount() == 3) {
lastVisibleItem = Math.max(Math.max(lastVisibleItems[0], lastVisibleItems[1]), lastVisibleItems[2]);
}


if (!isRefreshing && (totalItemCount <= lastVisibleItem + visibleThreshold)) {

Log.d(Const.DEBUG, "isRefreshing: " + isRefreshing);
Log.d(Const.DEBUG, "totalItemCount: " + totalItemCount);
Log.d(Const.DEBUG, "lastVisibileItem: " + lastVisibleItem);
Log.d(Const.DEBUG, "visibileThreshold: " + visibleThreshold);

Log.d(Const.DEBUG, "calling LoadMore()");

if (mIOnLoadMoreListener != null) {
mIOnLoadMoreListener.onLoadMore();
}

isRefreshing = true;
}
}
});

}

我在第一次调用时从服务器获得了 9 个值。因此,当我移动到最后一个索引 [8] 时,lastVisibleItem 将为 8,visibleThreshold 为 1,totalItemCount 为 9,因此下一次网络调用应该发生。现在实际发生的事情是,当第一次加载屏幕时,lastVisibleItem 应该是 1 或 2,但它返回 8,因此,将调用 loadMore()。

日志:

D/xx: Items Count: 9
D/xx: LastVisibleItems: [8]
03-22 15:22:52.772 5957-5957/codsiga.com.xx D/xx: LastVisibleItems Count: 1
03-22 15:22:52.772 5957-5957/codsiga.com.xx D/xx: isRefreshing: false
03-22 15:22:52.772 5957-5957/codsiga.com.xx D/xx: totalItemCount: 9
03-22 15:22:52.772 5957-5957/codsiga.com.xx D/xx: lastVisibileItem: 8
03-22 15:22:52.772 5957-5957/codsiga.com.xx D/xx: visibileThershold: 1
03-22 15:22:52.772 5957-5957/codsiga.com.xx D/xx: calling LoadMore()
03-22 15:22:52.772 5957-5957/codsiga.com.xx D/xx: onLoadMore()
03-22 15:22:52.798 5957-5957/codsiga.com.xx D/xx: getDataFromServer()

上面的代码有什么问题?需要帮助请叫我。相同的代码以前运行良好。

最佳答案

试试这个。

    private int pastVisiblesItems, visibleItemCount, totalItemCount;
private boolean loading = true;
private StaggeredGridLayoutManager layoutManager;
private RecyclerView recyclerView ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layoutManager=new StaggeredGridLayoutManager(2,1);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(layoutManager);
recycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

if (dy > 0) //for vertical scrolling
{

} else if (dy < 0) {

}
if (dx > 0)//for horizontal scrolling
{
visibleItemCount = layoutManager.getChildCount();
totalItemCount = layoutManager.getItemCount();
pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();

if (loading) {
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
loading = false;
loadMore(); //desired function call
}
}
}
}
});
}

API调用成功后请不要忘记设置loading=true

希望对你有帮助

关于android - Recyclerview StaggeredGridLayoutManager - 查找最后一个可见项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42948667/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com