【问题标题】:Unable to retrieve the very last item in endless scroll RecyclerView无法检索无限滚动 RecyclerView 中的最后一项
【发布时间】:2017-04-23 17:54:49
【问题描述】:

我有一个无穷无尽的 Recycler View,其中包含使用 JSoup 提取的在线论坛线程中的数据。 recyclerview 将不断填充自己,直到用户到达最后一页。一旦用户到达最后一页并滚动到最后一个可见项目,我想膨胀一个“结束视图”,但我无法检索它。

我尝试使用 recyclerview linearlayoutmanager 中的 getItemCount() 和 findLastVisibleItemPosition()。它设法获得正确的大小,但每次加载下一页时,“结束视图”都会在底部膨胀。当用户到达最后一页的最后一项时,它不会膨胀。

RecyclerAdapter.java

public RecyclerAdapter(Context context, final ArrayList<ReplyItem> recyclerReplyList, RecyclerView recyclerView) {
    this.recyclerReplyList= recyclerReplyList;
    this.context = context;

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {

        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView
                .getLayoutManager();


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

                        totalItemCount = linearLayoutManager.getItemCount();
                        lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                        firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
                        verylastVisibleItem = linearLayoutManager.findLastCompletelyVisibleItemPosition();

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

                            if (onLoadMoreListener != null) {
                                onLoadMoreListener.onLoadMore();

                            }

                            loading = true;

                        }

                    }
                });

    }

}


@Override
public int getItemViewType(int position) {


    if(recyclerReplyList.get(position) != null){
        return VIEW_POST;
    }

    else if(position == totalItemCount){
        return VIEW_END_ITEM;
    }

}


 @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                  int viewType) {
    RecyclerView.ViewHolder vh;
    if (viewType == VIEW_POST) {
        View v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.replies_row, parent, false);

        vh = new PostViewHolder(v);

    }

    else  if (viewType == VIEW_END_ITEM) {
        View v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.end_item, parent, false);

        vh = new EndViewHolder(v);

    }

     return vh;
}

【问题讨论】:

  • 你试过我的答案了吗?
  • @KishoreJethava 刚试过。有用!但它也会在用户每次到达前一页的底部时触发,在下一页加载之前。我必须在它上面加上另一个条件。谢谢!
  • 查看更新的答案。您也可以将答案标记为正确的!

标签: android android-recyclerview


【解决方案1】:

尝试将底部边距设置为您的回收站视图!

【讨论】:

    【解决方案2】:

    您可以使用 setOnScrollChangeListener,但它将支持 API 23 及更高版本

    recyclerView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    
                if (linearLayoutManager .findLastCompletelyVisibleItemPosition() == linearLayoutManager.findLastVisibleItemPosition())
                   //last item reached 
    
        });
    

    编辑

    要识别滚动方向,请使用 onScrollChange

    scrollXscrollY
    if (scrollY == 0) { 
        // scrolled horizontally  
    } 
    

    【讨论】:

    • 你为什么使用View#setOnScrollChangeListener?它不起作用,因为在大多数情况下 scrollXscrollY 的值为 0
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2018-04-09
    相关资源
    最近更新 更多