Android 向下滚动时,RecyclerView自动加载
我使用RecyclerView并在向下滚动时实现自动加载项目。但我有点小问题。当服务器只返回一个项目时,“onScrolled事件不用于加载下一个数据。在我的情况下,该项目包含用于加载下一个数据集的数据。请帮助我。Thx 对我的英语感到抱歉Android 向下滚动时,RecyclerView自动加载,android,android-recyclerview,onscrolllistener,Android,Android Recyclerview,Onscrolllistener,我使用RecyclerView并在向下滚动时实现自动加载项目。但我有点小问题。当服务器只返回一个项目时,“onScrolled事件不用于加载下一个数据。在我的情况下,该项目包含用于加载下一个数据集的数据。请帮助我。Thx 对我的英语感到抱歉 mNewsList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView
mNewsList.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int totalItem = mLayoutManager.getItemCount();
int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
if (!mNewsListModel.isWorking() && lastVisibleItem == totalItem - 1 && !mNewsRecyclerAdapter.hasErrorFooter()) {
mNewsListModel.getNewsListByDate(mNewsCategory, mNewsListModel.getLastResponse().getNewsNextDate());
}
}
});
我使用另一种解决方案自动加载项目。 使用另一个ViewType将新项目添加到适配器(例如,常用项目的ViewType=0,加载程序项目的ViewType=1)。 当recyclerView调用viewType=1的BindViewHolder时,我们需要开始加载数据。加载并放置加载的项目后,我们需要删除加载的项目并再次将其放置到列表的末尾 适配器应如下所示:
public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.ViewHolder> {
public static class ItemWrapper {
private int type;
private String name;
public ItemWrapper(int type) {
this.type = type;
}
public ItemWrapper(int type, String name) {
this.type = type;
this.name = name;
}
public int getType() {
return type;
}
public String getName() {
return name;
}
public static int getLoaderPosition(ArrayList<ItemWrapper> itemWrappers) {
for (int i = 0; i < itemWrappers.size(); i++) {
if (itemWrappers.get(i).getType() == TYPE_LOADER) {
return i;
}
}
return -1;
}
}
public static final int TYPE_ITEM = 0;
public static final int TYPE_LOADER = 1;
private boolean loadingInProgress = false;
private ArrayList<ItemWrapper> items;
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView text_title;
public ViewHolder(View v, int type) {
super(v);
if (type == TYPE_ITEM) {
text_title = (TextView) v.findViewById(R.id.text_title);
}
}
}
public DemoAdapter() {
items = new ArrayList<>();
items.add(new ItemWrapper(TYPE_ITEM, "one"));
items.add(new ItemWrapper(TYPE_ITEM, "two"));
items.add(new ItemWrapper(TYPE_ITEM, "three"));
items.add(new ItemWrapper(TYPE_LOADER));
}
public int getItemCount() {
return items.size();
}
public ItemWrapper getItem(int position) {
return items.get(position);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.elem_demo, parent, false);
ViewHolder vh = new ViewHolder(v, viewType);
return vh;
}
else if (viewType == TYPE_LOADER) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.elem_loader, parent, false);
ViewHolder vh = new ViewHolder(v, viewType);
return vh;
}
return null;
}
private void startLoadData() {
if (!loadingInProgress) {
loadingInProgress = true;
// load your data here
// then update list
onLoadSuccess(loadedItems);
}
}
private void onLoadSuccess(final ArrayList<ItemWrapper> loadedItems) {
try {
final int loaderPosition = ItemWrapper.getLoaderPosition(items);
items.remove(loaderPosition);
notifyItemRemoved(loaderPosition);
items.addAll(loadedItems);
items.add(new ItemWrapper(TYPE_LOADER));
notifyItemRangeInserted(loaderPosition, loadedItems.size());
}
catch (Exception e) {}
}
@Override
public int getItemViewType(int position) {
return getItem(position).getType();
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
int type = getItemViewType(position);
if (type == TYPE_ITEM) {
holder.text_title.setText(getItem(position).getName());
}
else if (type == TYPE_LOADER) {
startLoadData();
}
}
公共类DemoAdapter扩展了RecyclerView.Adapter{
公共静态类ItemWrapper{
私有int型;
私有字符串名称;
公共项包装器(int类型){
this.type=type;
}
公共ItemWrapper(int类型,字符串名称){
this.type=type;
this.name=名称;
}
公共int getType(){
返回类型;
}
公共字符串getName(){
返回名称;
}
公共静态整型getLoaderPosition(ArrayList itemWrappers){
对于(int i=0;i}如果itemcount小于6,则添加一个检查调用webservice一次again@ankitagrawal好的。如何检查不同设备上屏幕上的最大可见项数?不检查适配器数是否小于6,然后调用webservice