如何从api获取数据并在用户滚动

时间:2017-07-26 18:24:35

标签: android

我有一个API,一次可以提供每页10个结果

{ item1,
  item2,
  item3,
  .
  .
  item10
}

我有RecycleView,我想在其中显示结果。

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolder> {
    private Entry[] entry;

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public static class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        TextView labelText;
        TextView descText;
        ImageView itemImage;

        public ViewHolder(View v) {
            super(v);
            labelText = (TextView) v.findViewById(R.id.item_label);
            descText = (TextView) v.findViewById(R.id.item_text);
            itemImage = (ImageView) v.findViewById(R.id.item_image);
        }

    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public RecycleAdapter(Entry[] en) {
        entry = en;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public RecycleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new view
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_items, parent, false);
        // set the view's size, margins, paddings and layout parameters

        ViewHolder vh = new ViewHolder(view);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        holder.labelText.setText(entry[position].title);
        holder.itemImage.setImageResource(R.drawable.img);
        holder.descText.setText("Random Text to Recycle");

    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return entry.length;
    }
}

Entry对象包含Array,如果Object包含数据(基本上是String)。而不是这个我想传递和整数数组 表示API的页面,而不是我要列出该页面的所有10个项目

在我看来,我们一次只能获得一项的绑定功能或其他方式是在条目中插入所有项目而不是获取它们(我想避免)。

3 个答案:

答案 0 :(得分:0)

假设您的API一次为您提供X项。当使用position lastFetchedItem-Y(其中Y是用于为网络延迟提供缓冲区的小数字)调用getView时,请求下一个X项。收到它们后,您将更新支持适配器的模型并调用notifyDataSetChanged。这将为您提供平滑的滚动。调整X和Y以提高网络效率(较慢的网络或较慢的API,较大的Y)。

答案 1 :(得分:0)

使用Endless Scrolling with AdapterViews and RecyclerView

tutorial将帮助您实现paging功能。

答案 2 :(得分:0)

您可以使用recyclerView的addOnScrollListener行为来监控滚动,并使用layoutManager.findLastCompletelyVisibleItemPosition()来了解最后一项是谁。当您知道它时,您可以填充下一个项目#&# 39;之前已经提取并为了获得更好的用户体验,您可以使用adapter.notifyItemRangeInserted(int startPosition, int itemCount)从该邮件的下方通知列表,这样如果您在获取之前在recyclerView中有10个项目,那么在获取之后你就会#39 ; ll从最后一项(通过上面的layoutManager方法)通知添加到 itemCount (在您的情况下为10),然后显示的前10个仍将显示,下一个10将添加到回收器的底部,用户将能够继续&#39;滚动。

希望它有所帮助,祝你好运