android - 向下滚动时 RecyclerView 自动加载

标签 android android-recyclerview onscrolllistener

我使用 RecyclerView 并在向下滚动时实现自动加载项目。但我没有什么问题。当服务器仅返回一个项目时,“不调用 onScrolled 事件来加载下一个数据。在我的例子中,项目包含用于加载下一个数据集的数据。请帮助我。谢谢。

P.S:对不起我的英语。

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 调用 onBindViewHolder 时,我们需要开始加载数据。加载并放置加载项后,我们需要删除加载项并将其再次放到列表末尾。

适配器应该是这样的:

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();
    }
}

关于android - 向下滚动时 RecyclerView 自动加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37339316/

相关文章:

android - 自定义样式 - 在代码中检索颜色属性 - 只要颜色不是#ffffffff 就可以正常工作

java - 使用 JSCH (android) 将 ssh 日志打印到列表

android - 一次完成多项 Activity ?

android - 如果 Android API 不支持,如何隐藏小部件?

Android RecyclerView 错误的childCount

android - RecyclerView 的 onClick 将无法单击项目,仅当您单击 BETWEEN 项目时

java - Android:设置 RecyclerView 项目的重力

android - 如何在上下滚动时隐藏和取消隐藏 TextView

android - RecyclerView 删除项目不调用 OnScrollListener

Android 在 ScrollView 滚动时禁用子 onTouch