如何使用StaggeredLayoutManager实现无限滚动

Fra*_*riu 18 android endlessscroll staggeredgridlayout android-recyclerview

我已经尝试为LinearLayoutManager实现无限滚动并且它成功并尝试将LinearLayoutManager实现复制到StaggeredGridLayoutManager但它不起作用.

我只想获得firstVisibleItem.

在LinearLayoutManager中:

int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(int);
Run Code Online (Sandbox Code Playgroud)

但在StaggeredGridLayoutManager中是:

int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(int[])
Run Code Online (Sandbox Code Playgroud)

如何使用(int)not(int [])获取firstVisibleItem?

对此有什么好的方法/实施吗?

提前致谢.

Mat*_*hew 20

我搞定了:

您可以在StaggeredGridLayoutManager中使用以下两种方法之一:

  1. findFirstVisibleItemPositions(int[])
  2. findFirstCompletelyVisibleItemPositions(int[])

传递一个空的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");
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)


Ale*_*nko 7

这是我的一个实现ScrollListener.

这是我实现的代码ScrollListener:

private EndlessScrollListener scrollListener =
    new EndlessScrollListener(new EndlessScrollListener.RefreshList() {
        @Override public void onRefresh(int pageNumber) {
            //Here you can execute server connection or anything else to update data and present with Recycler view
            // Notice: It is sync method

        }
    });

recyclerView.addOnScrollListener(scrollListener);
Run Code Online (Sandbox Code Playgroud)

自定义ScrollListener类:

class EndlessScrollListener extends RecyclerView.OnScrollListener {
    private boolean isLoading;
    private boolean hasMorePages;
    private int pageNumber = 0;
    private RefreshList refreshList;
    private boolean isRefreshing;
    private int pastVisibleItems;



    public EndlessScrollListener(RefreshList refreshList) {
        this.isLoading = false;
        this.hasMorePages = true;
        this.refreshList = refreshList;
    }

    @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        StaggeredGridLayoutManager manager =
            (StaggeredGridLayoutManager) recyclerView.getLayoutManager();

        int visibleItemCount = manager.getChildCount();
        int totalItemCount = manager.getItemCount();
        int[] firstVisibleItems = manager.findFirstVisibleItemPositions(null);
        if (firstVisibleItems != null && firstVisibleItems.length > 0) {
            pastVisibleItems = firstVisibleItems[0];
        }

        if ((visibleItemCount + pastVisibleItems) >= totalItemCount && !isLoading) {
            isLoading = true;
            if (hasMorePages && !isRefreshing) {
                isRefreshing = true;
                new Handler().postDelayed(new Runnable() {
                    @Override public void run() {
                        refreshList.onRefresh(pageNumber);
                    }
                }, 200);
            }
        } else {
            isLoading = false;
        }
    }

    public void noMorePages() {
        this.hasMorePages = false;
    }

    public void notifyMorePages() {
        isRefreshing = false;
        pageNumber = pageNumber + 1;
    }



    public interface RefreshList {
        void onRefresh(int pageNumber);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 -1

int mSpanCount = 2;

int[] into = new int[mSpanCount];

int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(into)[0];
Run Code Online (Sandbox Code Playgroud)