RecyclerView.Adapter 显示最后一项时 notifyDataSetChanged() 不工作
RecyclerView.Adapter notifyDataSetChanged() not working when is showing last item
我正在为 RecyclerView
实施无限数据加载。当软件检测到最后一个项目将要显示时,它会下载新项目并调用以下函数(运行 它在主线程中):
int visibleItemCount = numberOfItemsPerRow;
int pastVisiblesItems = ((GridLayoutManager)recyclerView.getLayoutManager()).findLastVisibleItemPosition();
int totalItemCount = mLayoutManager.getItemCount();
if (loading) {
if ((visibleItemCount+pastVisiblesItems) >= totalItemCount) {
.
.
.
//After downloading data
loading = false;
getActivity().runOnUiThread(new Runnable() {
public void run() {
mAdapter.notifyDataSetChanged();
}
});
}
但是,如果我快速滚动并且在接收新数据之前显示最后一项,notifyDataSetChanged()
将不起作用。仅当我再次上下滚动以强制呈现新数据时,才会显示这些新数据。
知道哪里出了问题吗?
你可以试试:
RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
编辑:
为了您使用它来确定您使用的正确位置,
我打赌你的立场没有反映出合适的条件:
- 当视图为空时,最后可见位置将为 -1
- 当视图获得一个元素时,位置将为0
- 适配器数量将为 1
编辑 2:
我有类似的方法:
- 在队列中保存数据的搜索线程
- 按需清空队列
我有适配器
public class MyAdapter extends RecyclerView.Adapter<ItemCardAdapter.ViewHolder>
在适配器中我得到了一个列表:
List<T> _itemList;
我有方法 add(item)
/addAll(collection)
/clear()
来管理项目列表
三个重写方法:
@Override
public int getItemCount() {
return _itemList.size();
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) { }
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {}
持有人:
public class ViewHolder extends RecyclerView.ViewHolder {}
我通过 Adapter.add();
、clear();
管理数据,然后我在 UI 线程上调用 Adapter.notifidatasetChanged();
作为 Runnable 我没有遇到类似的问题你
您使用哪些库?
我的是:
- appcompat-v7:22.2.0'
- 支持-v4:22.2.0'
- 设计:22.2.0'
- recyclerview-v7:22.2.0'
- cardview-v7:22.2.0'
我正在为 RecyclerView
实施无限数据加载。当软件检测到最后一个项目将要显示时,它会下载新项目并调用以下函数(运行 它在主线程中):
int visibleItemCount = numberOfItemsPerRow;
int pastVisiblesItems = ((GridLayoutManager)recyclerView.getLayoutManager()).findLastVisibleItemPosition();
int totalItemCount = mLayoutManager.getItemCount();
if (loading) {
if ((visibleItemCount+pastVisiblesItems) >= totalItemCount) {
.
.
.
//After downloading data
loading = false;
getActivity().runOnUiThread(new Runnable() {
public void run() {
mAdapter.notifyDataSetChanged();
}
});
}
但是,如果我快速滚动并且在接收新数据之前显示最后一项,notifyDataSetChanged()
将不起作用。仅当我再次上下滚动以强制呈现新数据时,才会显示这些新数据。
知道哪里出了问题吗?
你可以试试:
RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
编辑:
为了您使用它来确定您使用的正确位置, 我打赌你的立场没有反映出合适的条件:
- 当视图为空时,最后可见位置将为 -1
- 当视图获得一个元素时,位置将为0
- 适配器数量将为 1
编辑 2:
我有类似的方法:
- 在队列中保存数据的搜索线程
- 按需清空队列
我有适配器
public class MyAdapter extends RecyclerView.Adapter<ItemCardAdapter.ViewHolder>
在适配器中我得到了一个列表:
List<T> _itemList;
我有方法
add(item)
/addAll(collection)
/clear()
来管理项目列表三个重写方法:
@Override public int getItemCount() { return _itemList.size(); }
@Override public void onBindViewHolder(ViewHolder holder, int position) { }
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {}
持有人:
public class ViewHolder extends RecyclerView.ViewHolder {}
我通过
Adapter.add();
、clear();
管理数据,然后我在 UI 线程上调用Adapter.notifidatasetChanged();
作为 Runnable 我没有遇到类似的问题你
您使用哪些库?
我的是:
- appcompat-v7:22.2.0'
- 支持-v4:22.2.0'
- 设计:22.2.0'
- recyclerview-v7:22.2.0'
- cardview-v7:22.2.0'