当一个item条目需要进行二次请求时,需要注意的是,当前用户滑动后,所停留的item,是否时刚刚请求数据回来的item如果不是,不能将之前的item请求的数据,放到该item上,所以,需要在holder赋值前,比较holer是否是请求数据的holer。
具体实现:
defHolder.categoryId = mCategoryList.get(position).getId();
final List<ChannelVodBean> channelList = mCategoryList.get(position).getChannelList();
if (channelList == null) {
mChannelRequestListener.requestChannel(defHolder, position);
} else {
defHolder.setData(channelList);
}
RequestApi.requestxxx(holder.categoryId, 0, 1)
.subscribeOn(Schedulers.io())
.compose(bindToLife())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new TagConsumer<List<ChannelVodBean>>(holder.categoryId, position) {
@Override
public void accept(List<ChannelVodBean> list) throws Exception {
//这里注意比对是否是请求时的数据
if (holder.categoryId.equals(tag())) {
holder.setData(list);
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
}
});
public abstract class TagConsumer<T> implements Consumer<T> {
private final Object tag;
private final int arg;
public<P> TagConsumer(P tag) {
this(tag, 0);
}
public<P> TagConsumer(P tag, int arg) {
this.tag = tag;
this.arg = arg;
}
public <P> P tag(){
return (P) tag;
}
public int arg(){
return arg;
}
}