我有一个 RecyclerView ,其中有一个大型集合,比如500多个项目。调用onBindViewHolder
时,我会生成异步HTTP请求以加载一些数据。
但是当我在列表中快速滚动时,如何取消对不再可见的所有项目的请求?我看到100个请求在后台启动,因为RecyclerView加载的方式,我想我滚动过去的每个项目都会调用onBindViewHolder?
我正在考虑在onBindViewHolder
中启动等待500毫秒的请求,如果绑定到它的项仍然在视图中/仍然相同,则启动异步请求。这会有用吗?如果是,那么如何检查项目是否仍然在适配器内?
解决这个问题的正确方法是什么?
答案 0 :(得分:6)
您可以为OnScrollListener
:{/ p>制作RecyclerView
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
}
}
答案 1 :(得分:0)
您可以使用setTag()
中的View
来保存连接引用,就像这样
@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);
}