package com.liyu.fakeweather.ui.reading;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.View;
import com.liyu.fakeweather.R;
import com.liyu.fakeweather.model.XianduCategory;
import com.liyu.fakeweather.ui.MainActivity;
import com.liyu.fakeweather.ui.base.BaseFragment;
import com.liyu.fakeweather.utils.ACache;
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.io.Serializable;
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/12/13.
*/
public class ReadingFragment extends BaseFragment {
private static final String CACHE_XIANDU_CATE = "xiandu_cache";
private Toolbar mToolbar;
private ACache mCache;
private Subscription subscription;
@Override
protected int getLayoutId() {
return R.layout.fragment_tab_viewpager;
}
@Override
protected void initViews() {
mCache = ACache.get(getActivity());
mToolbar = findView(R.id.toolbar);
mToolbar.setTitle("闲读");
((MainActivity) getActivity()).initDrawer(mToolbar);
}
@Override
protected void lazyFetchData() {
List<XianduCategory> xianduCategories = (List<XianduCategory>) mCache.getAsObject(CACHE_XIANDU_CATE);
if (xianduCategories != null && xianduCategories.size() > 0) {
initTabLayout(xianduCategories);
return;
}
String host = "http://gank.io/xiandu";
subscription = Observable.just(host).subscribeOn(Schedulers.io()).map(new Func1<String, List<XianduCategory>>() {
@Override
public List<XianduCategory> call(String host) {
List<XianduCategory> list = new ArrayList<>();
try {
Document doc = Jsoup.connect(host).timeout(10000).get();
Element cate = doc.select("div#xiandu_cat").first();
Elements links = cate.select("a[href]");
for (Element element : links) {
XianduCategory xiandu = new XianduCategory();
xiandu.setName(element.text());
xiandu.setUrl(element.attr("abs:href"));
list.add(xiandu);
}
} catch (IOException e) {
Snackbar.make(getView(), "获取分类失败!", Snackbar.LENGTH_INDEFINITE).setAction("重试", new View.OnClickListener() {
@Override
public void onClick(View view) {
lazyFetchData();
}
}).setActionTextColor(getActivity().getResources().getColor(R.color.actionColor)).show();
}
if (list.size() > 0) {
list.get(0).setUrl(host + "/wow");
}
return list;
}
}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<XianduCategory>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Snackbar.make(getView(), "获取分类失败!", Snackbar.LENGTH_INDEFINITE).setAction("重试", new View.OnClickListener() {
@Override
public void onClick(View view) {
lazyFetchData();
}
}).setActionTextColor(getActivity().getResources().getColor(R.color.actionColor)).show();
}
@Override
public void onNext(List<XianduCategory> xianduCategories) {
mCache.put(CACHE_XIANDU_CATE, (Serializable) xianduCategories);
initTabLayout(xianduCategories);
}
});
}
private void initTabLayout(List<XianduCategory> xianduCategories) {
TabLayout tabLayout = findView(R.id.tabs);
ViewPager viewPager = findView(R.id.viewPager);
setupViewPager(viewPager, xianduCategories);
viewPager.setOffscreenPageLimit(viewPager.getAdapter().getCount());
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}
private void setupViewPager(ViewPager viewPager, List<XianduCategory> xianduCategories) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
for (XianduCategory xiandu : xianduCategories) {
Fragment fragment = new CategoryFragment();
Bundle data = new Bundle();
data.putString("url", xiandu.getUrl());
fragment.setArguments(data);
adapter.addFrag(fragment, xiandu.getName());
}
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (subscription != null && !subscription.isUnsubscribed())
subscription.unsubscribe();
}
}