当前位置:  开发笔记 > Android > 正文

带有ProgressBar的Endless RecyclerView用于分页

如何解决《带有ProgressBar的EndlessRecyclerView用于分页》经验,为你挑选了3个好方法。

我正在使用一个RecyclerView并从API获取对象,批量为十.对于分页,我使用EndlessRecyclerOnScrollListener.

一切正常.现在剩下的就是在列表底部添加一个进度微调器,同时由API提取下一批对象.以下是Google Play商店应用的屏幕截图,其中显示了以下ProgressBar内容RecyclerView:

在此输入图像描述

问题是,在获取下一批对象时,既RecyclerView没有EndlessRecyclerOnScrollListener内置支持也没有显示ProgressBar底部的内置支持.

我已经看到了以下答案:

1. 将不确定的ProgressBar页脚放在RecyclerView网格中.

2. 添加项目到无尽的滚动RecyclerViewProgressBar在底部.

我不满意这些答案(由同一个人).这涉及null 在用户滚动时中途将对象拴入数据集中,然后在下一批次交付后将其取出.它看起来像是一个黑客,可以回避主要问题,可能会或可能不会正常工作.它会在列表中引起一些刺耳和失真

使用SwipeRefreshLayout不是解决方案.SwipeRefreshLayout涉及从顶部拉取以获取最新的项目,并且它无论如何都不显示进度视图.

有人可以为此提供一个很好的解决方案吗?我有兴趣知道Google是如何为自己的应用程序实现此功能的(Gmail应用程序也有此功能).是否有任何文章详细显示?所有的答案和评论将不胜感激.谢谢.

其他一些参考:

1. 分页RecyclerView.(精湛的概述......)

2. RecyclerView页眉和页脚.(更多相同......)

3. 无尽RecyclerViewProgressBar在底部.



1> Akshar Patel..:

这里是简单和清洁的方法.

从此Codepath指南实施Endless Scrolling ,然后按照以下步骤操作.

1.在RecyclerView下添加进度条.

    

    

    

这里android:paddingBottom ="50dp"android:clipToPadding ="false"非常重要.

2.获取进度条的参考.

progressBar = findViewById(R.id.progressBar);

3.定义显示和隐藏进度条的方法.

void showProgressView() {
    progressBar.setVisibility(View.VISIBLE);
}

void hideProgressView() {
    progressBar.setVisibility(View.INVISIBLE);
}


简洁大方
这是太棒了。尝试和测试。完美的作品!

2> Skizo-ozᴉʞS..:

我在我的旧项目上实现了这个,我做了如下......

我已经创建了一个interface像你的例子那样的人

public interface LoadMoreItems {
  void LoadItems();
}

然后我添加了一个addOnScrollListener()在我的Adapter

 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();
                if (!loading
                        && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                    //End of the items
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.LoadItems();
                    }
                    loading = true;

                }
            }
        });

onCreateViewHolder()是我放ProgressBar或不放的地方.

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

        vh = new StudentViewHolder(v);
    } else {
        View v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.progressbar_item, parent, false);

        vh = new ProgressViewHolder(v);
    }
    return vh;
}

在我MainActivity那是我把它LoadItems()添加其他项目的地方是:

mAdapter.setOnLoadMoreListener(new LoadMoreItems() {
        @Override
        public void LoadItems() {
            DataItemsList.add(null);
            mAdapter.notifyItemInserted(DataItemsList.size() - 1);

            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    //   remove progress item
                    DataItemsList.remove(DataItemsList.size() - 1);
                    mAdapter.notifyItemRemoved(DataItemsList.size());
                    //add items one by one
                    //When you've added the items call the setLoaded()
                    mAdapter.setLoaded();
                    //if you put all of the items at once call
                    // mAdapter.notifyDataSetChanged();
                }
            }, 2000); //time 2 seconds

        }
    });

有关更多信息,我只是遵循了这一点Github repository(注意:这是使用AsyncTask它可能是有用的作为我的答案,因为我手动完成它而不是数据来自API但它应该也可以工作)这篇文章也对我很有帮助- recyclerview-with-progress -酒吧

另外我不知道你是否命名它但是我也发现了这篇文章infinite_scrolling_recyclerview,也许它也可能对你有所帮助.

如果它不是你想要的,请告诉我这个代码有什么问题,我会尝试修改它.

希望能帮助到你.

编辑

因为你不想删除一个项目...我发现我猜一个人footer只删除了这个帖子:diseño-android-endless-recyclerview.

这是为了ListView但我知道你可以调整它,因为RecyclerView他没有删除任何他刚刚放置Visible/Invisible的项目ProgressBar:detecting-end-of-listview

另请看一下:这个问题 android-implementing-progressbar-and-loading-for-endless-list-like-android


谢谢....这是我试图避免的方法,因为我不想在滚动过程中添加和删除项目... :)

3> Bhargav..:

还有另一种方法可以做到这一点。

首先,适配器的getItemCount返回 listItems.size() + 1

返回VIEW_TYPE_LOADINGgetItemViewType()position >= listItems.size()。这样,加载器将仅显示在回收器视图列表的末尾。此解决方案的唯一问题是,即使到达最后一页,也会显示加载程序,因此,为了解决该问题,您需要将x-pagination-total-count适配器存储在适配器中,并且

然后您将条件更改为将视图类型返回

(position >= listItem.size())&&(listItem.size <= xPaginationTotalCount)

现在我才想到这个主意。

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有