我正在使用一个RecyclerView
并从API获取对象,批量为十.对于分页,我使用EndlessRecyclerOnScrollListener
.
一切正常.现在剩下的就是在列表底部添加一个进度微调器,同时由API提取下一批对象.以下是Google Play商店应用的屏幕截图,其中显示了以下ProgressBar
内容RecyclerView
:
问题是,在获取下一批对象时,既RecyclerView
没有EndlessRecyclerOnScrollListener
内置支持也没有显示ProgressBar
底部的内置支持.
我已经看到了以下答案:
1. 将不确定的ProgressBar
页脚放在RecyclerView
网格中.
2. 添加项目到无尽的滚动RecyclerView
与ProgressBar
在底部.
我不满意这些答案(由同一个人).这涉及null
在用户滚动时中途将对象拴入数据集中,然后在下一批次交付后将其取出.它看起来像是一个黑客,可以回避主要问题,可能会或可能不会正常工作.它会在列表中引起一些刺耳和失真
使用SwipeRefreshLayout
不是解决方案.SwipeRefreshLayout
涉及从顶部拉取以获取最新的项目,并且它无论如何都不显示进度视图.
有人可以为此提供一个很好的解决方案吗?我有兴趣知道Google是如何为自己的应用程序实现此功能的(Gmail应用程序也有此功能).是否有任何文章详细显示?所有的答案和评论将不胜感激.谢谢.
其他一些参考:
1. 分页RecyclerView
.(精湛的概述......)
2. RecyclerView
页眉和页脚.(更多相同......)
3. 无尽RecyclerView
用ProgressBar
在底部.
这里是简单和清洁的方法.
从此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); }
我在我的旧项目上实现了这个,我做了如下......
我已经创建了一个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
还有另一种方法可以做到这一点。
首先,适配器的getItemCount返回 listItems.size() + 1
返回VIEW_TYPE_LOADING
在getItemViewType()
了position >= listItems.size()
。这样,加载器将仅显示在回收器视图列表的末尾。此解决方案的唯一问题是,即使到达最后一页,也会显示加载程序,因此,为了解决该问题,您需要将x-pagination-total-count
适配器存储在适配器中,并且
然后您将条件更改为将视图类型返回
(position >= listItem.size())&&(listItem.size <= xPaginationTotalCount)
。
现在我才想到这个主意。