package com.linroid.sky31radio.ui.fragment; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.gson.reflect.TypeToken; import com.linroid.sky31radio.R; import com.linroid.sky31radio.data.ApiService; import com.linroid.sky31radio.data.DiskCacheManager; import com.linroid.sky31radio.model.Album; import com.linroid.sky31radio.model.Pagination; import com.linroid.sky31radio.ui.adapter.AlbumAdapter; import com.linroid.sky31radio.ui.base.InjectableFragment; import com.linroid.sky31radio.view.ContentLoaderView; import com.squareup.picasso.Picasso; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.InjectView; import rx.Observable; import rx.Observer; import rx.Subscriber; import rx.android.app.AppObservable; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import timber.log.Timber; public class AlbumListFragment extends InjectableFragment implements ContentLoaderView.OnRefreshListener { public static final String KEY_ALBUM = "key_album"; @InjectView(R.id.content_loader) ContentLoaderView loaderView; @InjectView(R.id.recycler) RecyclerView recyclerView; @Inject Picasso picasso; @Inject ApiService apiService; @Inject DiskCacheManager cacheManager; boolean hasLoaded = false; AlbumAdapter adapter; AlbumAdapter.OnAlbumSelectedListener listener; public static AlbumListFragment newInstance() { AlbumListFragment fragment = new AlbumListFragment(); Bundle args = new Bundle(); fragment.setArguments(args); return fragment; } public AlbumListFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); adapter = new AlbumAdapter(getActivity(), picasso); adapter.setOnAlbumSelectedListener(listener); if(savedInstanceState!=null){ List<Album> albumList = savedInstanceState.getParcelableArrayList(KEY_ALBUM); adapter.setListData(albumList); }else{ loadData(1); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelableArrayList(KEY_ALBUM, (ArrayList<Album>) adapter.getAlbumList()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_album_list, container, false); ButterKnife.inject(this, view); recyclerView.setHasFixedSize(true); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2)); loaderView.setAdapter(adapter); loaderView.setOnRefreshListener(this); return view; } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if(activity instanceof AlbumAdapter.OnAlbumSelectedListener){ listener = (AlbumAdapter.OnAlbumSelectedListener) activity; }else{ throw new IllegalArgumentException(" activity must implement AlbumAdapter.OnAlbumSelectedListener"); } } @Override public void onDetach() { super.onDetach(); adapter.setOnAlbumSelectedListener(null); } public void loadData(int page){ if(!hasLoaded){ AppObservable.bindFragment(this, Observable.create(new Observable.OnSubscribe<Pagination<Album>>() { @Override public void call(Subscriber<? super Pagination<Album>> subscriber) { if (cacheManager.exits(DiskCacheManager.KEY_ALBUM)) { Type type = new TypeToken<Pagination<Album>>() {}.getType(); Pagination<Album> cachedData = cacheManager.get(DiskCacheManager.KEY_ALBUM, type); if(cachedData!=null){ subscriber.onNext(cachedData); } } } })).subscribe(observer); } AppObservable.bindFragment(this, apiService.listAlbums(page)) .map(new Func1<Pagination<Album>, Pagination<Album>>() { @Override public Pagination<Album> call(Pagination<Album> pagination) { cacheManager.put(DiskCacheManager.KEY_ALBUM, pagination); return pagination; } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); } Observer<Pagination<Album>> observer = new Observer<Pagination<Album>>() { @Override public void onCompleted() { Timber.i("listAlbum onCompleted"); } @Override public void onError(Throwable throwable) { Timber.e(throwable, "发生错误: %s", throwable.getMessage()); loaderView.notifyLoadFailed(throwable); } @Override public void onNext(Pagination<Album> pagination) { hasLoaded = true; loaderView.setPage(pagination.getCurrentPage(), pagination.getLastPage()); adapter.setListData(pagination.getData()); adapter.notifyDataSetChanged(); } }; @Override public void onRefresh(boolean fromSwipe) { loadData(1); } }