recylerview的findLastCompletelyVisibleItemPosition()方法不适用于可变大小的项目

时间:2017-03-28 09:56:28

标签: android android-recyclerview

我使用了以下代码

 private boolean isLastItemDisplaying(RecyclerView recyclerView){
    if (recyclerView.getAdapter().getItemCount() != 0) {
        int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
        if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
            return true;
    }
    return false;
}
private final RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
        // code
        if (isLastItemDisplaying(recyclerView)) {
            if (loadallow){
                if (postProviderList.size()<20 && postProviderList.size()>=1) {
                    loadallow = false;
                }else{
                    loadallow = false;
                    LoadPostsMore();
                }
            }
        }
    }

    @Override
    public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
        // code
    }
};

检测Recyclerview列表中可见的最后一项并加载更多项目。这一直运作良好,直到我有一些不同高度的物品和一些物品的高度几乎等于手机屏幕的高度。然后即使最后一项可见,isLastItemDisplaying(RecyclerView recyclerView)也会返回false。我相信有更好的解决方案。

问题已解决 这可能会帮助那些面临同样问题的人。问题出在findLastCompletelyVisibleItemPosition()方法上。由于最后一个可见项的项目大小超过了设备屏幕,因此该方法显然返回false。它应该替换为findLastVisibleItemPosition()。现在这可以按预期工作了。

1 个答案:

答案 0 :(得分:-1)

所以你可以做的是使用这段代码删除最后一项:

adapter.postProviderList.remove(postProviderList.size());
adapter.notifyItemremoved(postProviderList.size());

希望这会有所帮助:)