我正在使用一个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页眉和页脚.(更多相同......)
android android-listview android-progressbar android-5.0-lollipop android-recyclerview
如何在网格RecycleView中获取"向上滚动以加载更多"的不确定循环指示符?
该模式在那里描述:http://www.google.com/design/spec/components/progress-activity.html#progress-activity-behavior in"两阶段加载"和"示例2:向上滚动以加载更多"示例视频.
我正在尝试使用新的RecyclerView来实现这一点,但是我找不到一种"不太苛刻"的方式来做到这一点,首先是因为没有办法在网格中添加覆盖整行的页脚.有什么建议?
在正常的recyclerview中,最新的项目都在顶部,如果您将项目添加到recyclerview中,它会将现有项目向下推,新项目将位于顶部位置.
在reverseLayout recyclerview中,最新的项目都在底部,如果您将项目添加到recyclerview中,则会在底部添加.这种布局对于评论提要非常有用,您希望最新评论位于底部.
例如,当您评论朋友的状态时,Facebook评论供稿就是一个很好的例子.您可以看到评论都有时间在底部发布,时间从上到下从12小时减少到10小时:
reverseLayout很容易设置,我使用这段代码完成了它:
mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
Run Code Online (Sandbox Code Playgroud)
然而,我正在努力附加一个反向无限滚动监听器.我使用下面的维伦的代码,我的问题了一段时间后(在底部带有进度添加项目到无尽的滚动RecyclerView),然后修改它,使它的onLoadMoreListener只会激活自己当它向下,而不是向上滚动.您想要向上滚动到较旧的评论:
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//if you add on addOnScrollListener, it will cause the scroll listener to be called twice each time you reset your adapter
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
int firstVisibleItem;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
final int currentFirstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
if(lastVisibleItem > firstVisibleItem)
{
Log.i("SCROLLING …Run Code Online (Sandbox Code Playgroud) 我知道之前曾多次询问过这个问题,但我很困惑为什么有时会加载数据,有时候一旦到达列表末尾就没有加载数据.此外,当我去快速滚动通过列表,以及新的数据已经加载,而是立即返回我在列表中的第一项,并从服务器中删除从下一个页面的所有新加载的项目.所以这是第二个问题和第三个问题是,当我使用SwipeRefreshLayout加载的项目,我也没有得到新的项目,当我到达列表的末尾.
我在我的项目中实现了这个:https://gist.github.com/ssinss/e06f12ef66c51252563e
list.setLayoutManager(manager);
list.setEmptyView(emptyView);
list.setItemAnimator(new DefaultItemAnimator());
list.setAdapter(mAdapter);
loadJokes(1);
list.addOnScrollListener(new EndlessRecyclerOnScrollListener(manager) {
@Override
public void onLoadMore(final int current_page) {
loadMoreJokes(current_page);
}
});
Run Code Online (Sandbox Code Playgroud)
这是我从服务器加载更多项目的方法:
private void loadMoreJokes(int current_page) {
StringRequest request = new StringRequest(Request.Method.GET, AppConfig.URL_GET_ALL_JOKES + current_page,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
hideDialog();
try {
JSONObject object = new JSONObject(response);
boolean error = object.getBoolean("error");
JSONArray jokes = object.getJSONArray("jokes");
if (!error) {
for (int i = 0; i < jokes.length(); i++) {
JSONObject object1 = jokes.getJSONObject(i); …Run Code Online (Sandbox Code Playgroud) 我一直在关注此页面,将内容添加到Endless Scroll RecyclerView中,底部带有ProgressBar,我认为我做对了所有事情,但是由于某种原因,我回到了这一行onLoadMoreListener.onLoadMore();
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Handler.postDelayed(java.lang.Runnable, long)' on a null object reference
Run Code Online (Sandbox Code Playgroud)
我知道有很多有关空指针错误的文章,但是该行在if语句中,如果为空则不应执行。
if (onLoadMoreListener != null) {
onLoadMoreListener.onLoadMore();
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?我应该发布什么代码来帮助解决问题?
mAdapter.setOnLoadMoreListener(new MyAdapter.OnLoadMoreListener() {
@Override
public void onLoadMore() {
//add progress item
myDataset.add(null);
mAdapter.notifyItemInserted(myDataset.size() - 1);
handler.postDelayed(new Runnable() {
@Override
public void run() {
//remove progress item
myDataset.remove(myDataset.size() - 1);
mAdapter.notifyItemRemoved(myDataset.size());
MyRecyclerItems gridItem= new MyRecyclerItems();
gridItem.setAbout("Test");
gridItem.setEmail("tesssst@gmail.com");
myDataset.add(0,gridItem);
mAdapter.notifyItemInserted(myDataset.size());
mAdapter.setLoaded();
}
}, 2000);
System.out.println("load");
}
});
Run Code Online (Sandbox Code Playgroud)