package licola.demo.com.huabandemo.Module.Follow; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.View; import java.util.List; import butterknife.BindString; import org.greenrobot.eventbus.EventBus; import licola.demo.com.huabandemo.API.Fragment.OnPinsFragmentInteractionListener; import licola.demo.com.huabandemo.API.Fragment.OnRefreshFragmentInteractionListener; import licola.demo.com.huabandemo.API.HttpsAPI.FollowingAPI; import licola.demo.com.huabandemo.Adapter.RecyclerPinsHeadCardAdapter; import licola.demo.com.huabandemo.Base.BaseRecyclerHeadFragment; import licola.demo.com.huabandemo.Entity.PinsMainEntity; import licola.demo.com.huabandemo.HttpUtils.RetrofitClient; import licola.demo.com.huabandemo.R; import licola.demo.com.huabandemo.Util.Logger; import licola.demo.com.huabandemo.Util.NetUtils; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by LiCola on 2016/04/04 14:46 */ public class FollowPinsFragment extends BaseRecyclerHeadFragment<RecyclerPinsHeadCardAdapter, List<PinsMainEntity>> { //联网关键参数 private int mMaxId;//下一次联网的pinsId开始 private OnPinsFragmentInteractionListener mListener; private OnRefreshFragmentInteractionListener mRefreshListener; @BindString(R.string.snack_message_not_notify) String mStringNotNotify; @Override protected String getTAG() { return this.toString(); } public static FollowPinsFragment newInstance() { return new FollowPinsFragment(); } public FollowPinsFragment() { } @Override public void onAttach(Context context) { super.onAttach(context); Logger.d(context.toString()); if ((context instanceof OnRefreshFragmentInteractionListener) && (context instanceof OnPinsFragmentInteractionListener)) { mListener = (OnPinsFragmentInteractionListener) context; mRefreshListener = (OnRefreshFragmentInteractionListener) context; } else { throwRuntimeException(context); } if (context instanceof FollowActivity) { String a = ((FollowActivity) context).mAuthorization; if (a != null) { mAuthorization = a; } Logger.d(mAuthorization); } } @Override public void onDetach() { super.onDetach(); mListener = null; mRefreshListener = null; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mAuthorization = savedInstanceState.getString("key1"); Logger.d(mAuthorization); } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("key1", mAuthorization); Logger.d(); } @Override protected Subscription getHttpFirst() { return RetrofitClient.createService(FollowingAPI.class) .httpsMyFollowingPinsRx(mAuthorization, mLimit) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(FollowPinsBean::getPins) .filter(getFilterFunc1()) .subscribe(new Action1<List<PinsMainEntity>>() { @Override public void call(List<PinsMainEntity> pinsAndUserEntities) { if (checkNotify(pinsAndUserEntities)) { Logger.d(); mAdapter.setListNotify(pinsAndUserEntities); mMaxId = getMaxId(pinsAndUserEntities); } else { Logger.d("not notify"); NetUtils.showSnackBar(mRootView, mStringNotNotify); } } }, getErrorAction(), getCompleteAction()); } private Action1<Throwable> getErrorAction() { return throwable -> { Logger.d(throwable.toString()); checkException(throwable); mRefreshListener.OnRefreshState(false); }; } private Action0 getCompleteAction() { // return () -> { // Logger.d(); //// mRefreshListener.OnRefreshState(false); // ((OnRefreshFragmentInteractionListener) getActivity()).OnRefreshState(false); // }; return new Action0() { @Override public void call() { Logger.d(); // mRefreshListener.OnRefreshState(false); ((OnRefreshFragmentInteractionListener) getActivity()).OnRefreshState(false); } }; } /** * 判断集合是否和当前adapter中的集合对象一致 这里只简单实现 应该重写hash方法 用equals做判断 * * @param result * @return */ //// TODO: 2016/5/20 0020 方法需要重写 重写类的hash 和equals private boolean checkNotify(List<PinsMainEntity> result) { if (!mAdapter.getList().isEmpty()) { if (mAdapter.getList().get(0).getFile().getKey().equals(result.get(0).getFile().getKey())) { return false; } } return true; } private int getMaxId(List<PinsMainEntity> result) { return result.get(result.size() - 1).getPin_id(); } @Override protected Subscription getHttpScroll() { return RetrofitClient.createService(FollowingAPI.class) .httpsMyFollowingPinsMaxRx(mAuthorization, mMaxId, mLimit) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(new Func1<FollowPinsBean, List<PinsMainEntity>>() { @Override public List<PinsMainEntity> call(FollowPinsBean followingPinsBean) { return followingPinsBean.getPins(); } }) .filter(getFilterFunc1()) .subscribe(new Subscriber<List<PinsMainEntity>>() { @Override public void onCompleted() { Logger.d(); } @Override public void onError(Throwable e) { Logger.d(e.toString()); checkException(e); } @Override public void onNext(List<PinsMainEntity> pinsAndUserEntities) { mAdapter.addListNotify(pinsAndUserEntities); mMaxId = getMaxId(pinsAndUserEntities); } }); } @Override protected void initListener() { mAdapter.setOnClickItemListener(new RecyclerPinsHeadCardAdapter.OnAdapterListener() { @Override public void onClickImage(PinsMainEntity bean, View view) { EventBus.getDefault().postSticky(bean); mListener.onClickPinsItemImage(bean, view); } @Override public void onClickTitleInfo(PinsMainEntity bean, View view) { EventBus.getDefault().postSticky(bean); mListener.onClickPinsItemText(bean, view); } @Override public void onClickInfoGather(PinsMainEntity bean, View view) { Logger.d(); //todo 收集时间 类内部处理不传递 } @Override public void onClickInfoLike(PinsMainEntity bean, View view) { Logger.d(); } }); } @Override protected View getHeadView() { return null; } @Override protected int getAdapterPosition() { return mAdapter.getAdapterPosition(); } @Override protected RecyclerPinsHeadCardAdapter setAdapter() { return new RecyclerPinsHeadCardAdapter(mRecyclerView); } }