Android 向下滚动时,RecyclerView自动加载

Android 向下滚动时,RecyclerView自动加载,android,android-recyclerview,onscrolllistener,Android,Android Recyclerview,Onscrolllistener,我使用RecyclerView并在向下滚动时实现自动加载项目。但我有点小问题。当服务器只返回一个项目时,“onScrolled事件不用于加载下一个数据。在我的情况下,该项目包含用于加载下一个数据集的数据。请帮助我。Thx 对我的英语感到抱歉 mNewsList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView

我使用RecyclerView并在向下滚动时实现自动加载项目。但我有点小问题。当服务器只返回一个项目时,“onScrolled事件不用于加载下一个数据。在我的情况下,该项目包含用于加载下一个数据集的数据。请帮助我。Thx

对我的英语感到抱歉

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