package com.dl7.mvp.module.news.special;
import com.dl7.mvp.adapter.item.SpecialItem;
import com.dl7.mvp.api.RetrofitService;
import com.dl7.mvp.api.bean.NewsItemInfo;
import com.dl7.mvp.api.bean.SpecialInfo;
import com.dl7.mvp.api.bean.SpecialInfo.TopicsEntity;
import com.dl7.mvp.module.base.IBasePresenter;
import com.orhanobut.logger.Logger;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.functions.Func2;
/**
* Created by long on 2016/8/26.
* 专题 Presenter
*/
public class SpecialPresenter implements IBasePresenter {
private final String mSpecialId;
private final ISpecialView mView;
public SpecialPresenter(ISpecialView view, String specialId) {
this.mSpecialId = specialId;
this.mView = view;
}
@Override
public void getData(boolean isRefresh) {
RetrofitService.getSpecial(mSpecialId)
.doOnSubscribe(new Action0() {
@Override
public void call() {
mView.showLoading();
}
})
.flatMap(new Func1<SpecialInfo, Observable<SpecialItem>>() {
@Override
public Observable<SpecialItem> call(SpecialInfo specialBean) {
mView.loadBanner(specialBean);
return _convertSpecialBeanToItem(specialBean);
}
})
.toList()
.compose(mView.<List<SpecialItem>>bindToLife())
.subscribe(new Subscriber<List<SpecialItem>>() {
@Override
public void onCompleted() {
mView.hideLoading();
}
@Override
public void onError(Throwable e) {
Logger.e(e.toString());
mView.showNetError();
}
@Override
public void onNext(List<SpecialItem> specialItems) {
mView.loadData(specialItems);
}
});
}
@Override
public void getMoreData() {
}
/**
* 转换数据,接口数据有点乱,这里做一些处理
* @param specialBean
* @return
*/
private Observable<SpecialItem> _convertSpecialBeanToItem(SpecialInfo specialBean) {
// 这边 +1 是接口数据还有个 topicsplus 的字段可能是穿插在 topics 字段列表中间。这里没有处理 topicsplus
final SpecialItem[] specialItems = new SpecialItem[specialBean.getTopics().size() + 1];
return Observable.from(specialBean.getTopics())
// 获取头部
.doOnNext(new Action1<TopicsEntity>() {
@Override
public void call(TopicsEntity topicsEntity) {
specialItems[topicsEntity.getIndex() - 1] = new SpecialItem(true,
topicsEntity.getIndex() + "/" + specialItems.length + " " + topicsEntity.getTname());
}
})
// 排序
.toSortedList(new Func2<TopicsEntity, TopicsEntity, Integer>() {
@Override
public Integer call(TopicsEntity topicsEntity, TopicsEntity topicsEntity2) {
return topicsEntity.getIndex() - topicsEntity2.getIndex();
}
})
// 拆分
.flatMap(new Func1<List<TopicsEntity>, Observable<TopicsEntity>>() {
@Override
public Observable<TopicsEntity> call(List<TopicsEntity> topicsEntities) {
return Observable.from(topicsEntities);
}
})
.flatMap(new Func1<TopicsEntity, Observable<SpecialItem>>() {
@Override
public Observable<SpecialItem> call(TopicsEntity topicsEntity) {
// 转换并在每个列表项增加头部
return Observable.from(topicsEntity.getDocs())
.map(new Func1<NewsItemInfo, SpecialItem>() {
@Override
public SpecialItem call(NewsItemInfo newsItemBean) {
return new SpecialItem(newsItemBean);
}
})
.startWith(specialItems[topicsEntity.getIndex() - 1]);
}
});
}
}