Y.S*_*Y.S 57 android android-listview android-progressbar android-5.0-lollipop android-recyclerview
我正在使用一个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
页眉和页脚.(更多相同......)
Aks*_*tel 18
这里是简单和清洁的方法.
从此Codepath指南实施Endless Scrolling ,然后按照以下步骤操作.
1.在RecyclerView下添加进度条.
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_movie_grid"
android:layout_width="0dp"
android:layout_height="0dp"
android:paddingBottom="50dp"
android:clipToPadding="false"
android:background="@android:color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</android.support.v7.widget.RecyclerView>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:background="@android:color/transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
Run Code Online (Sandbox Code Playgroud)
这里android:paddingBottom ="50dp"和android:clipToPadding ="false"非常重要.
2.获取进度条的参考.
progressBar = findViewById(R.id.progressBar);
Run Code Online (Sandbox Code Playgroud)
3.定义显示和隐藏进度条的方法.
void showProgressView() {
progressBar.setVisibility(View.VISIBLE);
}
void hideProgressView() {
progressBar.setVisibility(View.INVISIBLE);
}
Run Code Online (Sandbox Code Playgroud)
Ski*_*ᴉʞS 16
我在我的旧项目上实现了这个,我做了如下......
我已经创建了一个interface
像你的例子那样的人
public interface LoadMoreItems {
void LoadItems();
}
Run Code Online (Sandbox Code Playgroud)
然后我添加了一个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;
}
}
});
Run Code Online (Sandbox Code Playgroud)
这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;
}
Run Code Online (Sandbox Code Playgroud)
在我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
}
});
Run Code Online (Sandbox Code Playgroud)
有关更多信息,我只是遵循了这一点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
还有另一种方法可以做到这一点。
listItems.size() + 1
VIEW_TYPE_LOADING
在getItemViewType()
了position >= listItems.size()
。这样,加载器将仅显示在回收器视图列表的末尾。此解决方案的唯一问题是,即使到达最后一页,也会显示加载程序,因此,为了解决该问题,您需要将x-pagination-total-count
适配器存储在适配器中,并且然后您将条件更改为将视图类型返回
(position >= listItem.size())&&(listItem.size <= xPaginationTotalCount)
。
现在我才想到这个主意。
归档时间: |
|
查看次数: |
42647 次 |
最近记录: |