RecyclerView和大量项目的后台请求

5

我有一个包含500多个项目的RecyclerView,当调用 onBindViewHolder时,我会发起异步HTTP请求来加载一些数据。

但是,当我快速向下滚动列表时,如何取消所有不再显示的项目的请求?由于RecyclerView的加载方式,我看到了100多个后台请求启动,我认为对于我滚动过去的每个项目,都会调用 onBindViewHolder?

我想在onBindViewHolder中启动一个等待500毫秒的请求,如果它仍然在视图中/仍然相同,则开始异步请求。 这个方法可行吗? 如果可以,那么如何从适配器中检查项目是否仍然在视图中?

解决这个问题的正确方法是什么?


你可以使用无限滚动设计,例如,您可以先加载50个项目。如果用户到达底部,则再加载50个项目。但是,当使用异步调用时,我在使用RecyclerView时遇到了一些奇怪的错误。因此,我不建议这样做。 - Joshua
2个回答

7
您可以为RecyclerView创建一个OnScrollListener
 public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (scrollState == SCROLL_STATE_IDLE){
        int firstVisibleItem = view.getFirstVisiblePosition();
        int lastVisiblePosition = view.getLastVisiblePosition();

        //call request from firstVisibleItem to lastVisiblePosition 

    }
}

谢谢。从这个方法中,我是直接更新与我的RecyclerView适配器绑定的集合还是获得ViewHolder并更新它们? - lahsrah
在这里,您可以调用适配器中的函数来加载数据(传递视图的位置)。您可以在函数中编写任何内容,无论是否访问viewholder。 - mdtuyen
我已经让这个更新适配器的方法工作了,但我认为它不够高效。我不想为适配器中的所有项目加载所有数据,我更愿意只更新单个视图持有者对象。有什么干净的方法可以从这里访问视图持有者? - lahsrah

0

你可以在 View 中使用 setTag() 来保存连接引用,像这样

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    HttpURLConnection httpURLConnection;
    if (holder.itemView.getTag() != null) {
        httpURLConnection = (HttpURLConnection)holder.itemView.getTag();
        //close the connection
        httpURLConnection.disconnect();
    }
    // create your connection
    httpURLConnection = new HttpURLConnection();
    holder.itemView.setTag(httpURLConnection);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接