package com.liyu.fakeweather.ui.girl; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import com.liyu.fakeweather.R; import com.liyu.fakeweather.event.GirlsComingEvent; import com.liyu.fakeweather.model.Girl; import com.liyu.fakeweather.service.GirlService; import com.liyu.fakeweather.ui.base.BaseActivity; import com.liyu.fakeweather.ui.girl.adapter.GirlsAdapter; import com.liyu.fakeweather.utils.ThemeUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.Observer; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by liyu on 2016/11/3. */ public class MzituPictureActivity extends BaseActivity { public static final String EXTRA_IMAGE_URL = "image_url"; public static final String EXTRA_IMAGE_TITLE = "image_title"; private RecyclerView recyclerView; private GirlsAdapter adapter; private String baseUrl = ""; protected SwipeRefreshLayout refreshLayout; private int totalPages = 1; private Subscription getPageSubscription; private Subscription getPicSubscription; public static Intent newIntent(Context context, String url, String desc) { Intent intent = new Intent(context, MzituPictureActivity.class); intent.putExtra(MzituPictureActivity.EXTRA_IMAGE_URL, url); intent.putExtra(MzituPictureActivity.EXTRA_IMAGE_TITLE, desc); return intent; } @Override protected int getLayoutId() { return R.layout.activity_mzitu_picture; } @Override protected int getMenuId() { return 0; } @Override protected void initViews(Bundle savedInstanceState) { setDisplayHomeAsUpEnabled(true); baseUrl = getIntent().getStringExtra(EXTRA_IMAGE_URL); refreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (adapter.getData() == null || adapter.getData().size() == 0) loadData(); else { adapter.notifyDataSetChanged(); showRefreshing(false); } } }); refreshLayout.setColorSchemeResources(ThemeUtil.getCurrentColorPrimary(this)); recyclerView = (RecyclerView) findViewById(R.id.rv_gank); final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); adapter = new GirlsAdapter(this, null); recyclerView.setAdapter(adapter); } private void getMeiziFromServer(int page) { String url = baseUrl + "/" + page; getPicSubscription = Observable.just(url).subscribeOn(Schedulers.io()).map(new Func1<String, List<Girl>>() { @Override public List<Girl> call(String url) { List<Girl> girls = new ArrayList<>(); try { Document doc = Jsoup.connect(url).timeout(10000).get(); Element total = doc.select("div.main-image").first(); String s = total.select("img").first().attr("src"); girls.add(new Girl(s)); } catch (IOException e) { e.printStackTrace(); } return girls; } }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<Girl>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { showRefreshing(false); } @Override public void onNext(List<Girl> girls) { GirlService.start(MzituPictureActivity.this, baseUrl, girls); } }); } @Override protected void loadData() { showRefreshing(true); adapter.setNewData(null); getPageSubscription = Observable.just(baseUrl).subscribeOn(Schedulers.io()).map(new Func1<String, List<Girl>>() { @Override public List<Girl> call(String url) { List<Girl> girls = new ArrayList<>(); try { Document doc = Jsoup.connect(url).timeout(10000).get(); Element total = doc.select("div.pagenavi").first(); Elements spans = total.select("span"); for (Element s : spans) { int page; try { page = Integer.parseInt(s.text()); if (page >= totalPages) totalPages = page; } catch (Exception e) { } } } catch (Exception e) { e.printStackTrace(); } return girls; } }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<Girl>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { showRefreshing(false); } @Override public void onNext(List<Girl> girls) { for (int i = 1; i <= totalPages; i++) { getMeiziFromServer(i); } } }); } protected void showRefreshing(final boolean refresh) { refreshLayout.post(new Runnable() { @Override public void run() { refreshLayout.setRefreshing(refresh); } }); } @Subscribe(threadMode = ThreadMode.MAIN) public void girlIsComing(GirlsComingEvent event) { if (!event.getFrom().equals(baseUrl)) return; showRefreshing(false); if (adapter.getData() == null || adapter.getData().size() == 0) { adapter.setNewData(event.getGirls()); } else { adapter.addData(adapter.getData().size(), event.getGirls()); } } @Override public void onStart() { super.onStart(); if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this); } } @Override public void onDestroy() { if (EventBus.getDefault().isRegistered(this)) EventBus.getDefault().unregister(this); if (getPageSubscription != null && !getPageSubscription.isUnsubscribed()) getPageSubscription.unsubscribe(); if (getPicSubscription != null && !getPicSubscription.isUnsubscribed()) getPicSubscription.unsubscribe(); super.onDestroy(); } }