package com.anthony.app.module.newslist; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.RelativeLayout; import android.widget.Toast; import com.anthony.app.R; import com.anthony.app.dagger.DaggerFragment; import com.anthony.app.dagger.DataRepository; import com.anthony.app.dagger.component.ActivityComponent; import com.anthony.library.data.bean.Channel; import com.anthony.library.data.bean.NewsItem; import com.anthony.library.data.bean.NormalJsonInfo; import com.anthony.library.data.net.HttpSubscriber; import com.anthony.library.utils.SpUtil; import com.anthony.library.utils.TimeUtils; import com.anthony.pullrefreshview.PullToRefreshView; import com.anthony.rvhelper.adapter.MultiItemTypeAdapter; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.List; import javax.inject.Inject; import rx.Subscription; import rx.functions.Action0; /** * Created by Anthony on 2016/9/9. * Class Note: * abstract class support pullToRefresh + RecyclerView * <p> * todo preload data !!!! */ public abstract class AbsListFragment extends DaggerFragment { public static String EXTRA_CHANNEL = "channel"; // public static String EXTRA_URL = "url"; private static long AUTO_REFRESH_THRESHOLD = 60 * 1000; protected Channel mChannel; protected int mCurrentPageIndex = getInitPageIndex(); protected int mPageCount = 0; private RelativeLayout mReloadLayout; protected RecyclerView mRecyclerView; protected PullToRefreshView mPtr; protected MultiItemTypeAdapter mRecyclerAdapter; private TopicWrapper mTopicWrapper; // DataManager mDataManager; protected Gson mGson; private String newUrl = ""; @Inject DataRepository mDataRepository; @Override protected int getLayoutId() { return R.layout.prj_fragment_pull_list; } @Override protected void initDagger2(ActivityComponent activityComponent) { activityComponent.inject(this); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGson = new GsonBuilder().create(); if (getArguments() != null) { mChannel = (Channel) getArguments().getSerializable(EXTRA_CHANNEL); } } @Override protected void initViews(View rootView, Bundle savedInstanceState) { mPtr = (PullToRefreshView) rootView.findViewById(R.id.ptr); mPtr.setListener(new PullToRefreshView.OnRefreshListener() { @Override public void onRefresh() { refreshData(); } @Override public void onLoadMore() { if (mCurrentPageIndex < mPageCount + (getInitPageIndex() - 1)) { refreshMoreData(mCurrentPageIndex + 1); } else { // showToast("no more"); mPtr.onFinishLoading(); } } }); mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycleView); mRecyclerView.setLayoutManager(getLayoutManager()); if (getItemDecoration() != null) { mRecyclerView.addItemDecoration(getItemDecoration()); } mRecyclerAdapter = getAdapter(); mRecyclerAdapter.setOnItemClickListener(getItemListener()); mTopicWrapper = new TopicWrapper(getActivity(), mRecyclerAdapter); mRecyclerView.setAdapter(mTopicWrapper); //Init reload layout mReloadLayout = (RelativeLayout) rootView.findViewById(R.id.prj_layout_reload); mReloadLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mReloadLayout.setVisibility(View.INVISIBLE); mPtr.onAutoRefresh(); } }); //Add cache data to list when first enter // preLoad(); } @Override public void onResume() { super.onResume(); if (isNeedRefresh()) { new Handler().postDelayed(new Runnable() { @Override public void run() { mPtr.onAutoRefresh(); } }, 1000); } } //pre load data in database // private void preLoad() { // String result = SpUtil.getString(getActivity(), getFragmentUrl()); // if (TextUtils.isEmpty(result)) { // return; // } // mSubscription = // //获取Topic数据 // List topic = parseTopic(jsonInfo); // mTopicWrapper.clearTopic(); // if (topic != null && topic.size() > 0) { // mTopicWrapper.addTopic(topic); // mTopicWrapper.addTopicView(); // } else { // mTopicWrapper.deleteTopicView(); // } // // //获取新闻数据 // List data = parseData(jsonInfo); // if (data != null && data.size() > 0) { // mRecyclerAdapter.clearData(); // mRecyclerAdapter.addDataAll(data); // } // mRecyclerView.getAdapter().notifyDataSetChanged(); // } protected void refreshData() { loadData(getInitPageIndex()); } protected void refreshMoreData(int index) { loadData(index); } protected void loadData(final int requestPageIndex) { newUrl = getRequestUrl(requestPageIndex); Subscription subscription = mDataRepository.loadNewsJsonInfo(newUrl) .doOnTerminate(new Action0() { @Override public void call() { mPtr.onFinishLoading(); } }) .subscribe(new HttpSubscriber<NormalJsonInfo<NewsItem>>() { @Override public void onNext(NormalJsonInfo<NewsItem> jsonInfo) { SpUtil.putLong(getActivity(), newUrl + "_LRT", TimeUtils.getNowTime()); if (requestPageIndex == getInitPageIndex()) { if (jsonInfo.page_info != null) { mPageCount = parsePageCount(jsonInfo); } mCurrentPageIndex = getInitPageIndex(); } onDataReceived(requestPageIndex, parseTopic(jsonInfo), parseData(jsonInfo)); } @Override public void onError(Throwable e) { super.onError(e); onErrorDataReceived(); } }); mSubscriptions.add(subscription); } private void onDataReceived(int requestIndex, List topic, List data) { boolean isRefresh = (requestIndex == getInitPageIndex()); if (isRefresh) { mTopicWrapper.clearTopic(); mRecyclerAdapter.clearData(); if (topic != null && topic.size() > 0) { // mTopicWrapper.addGZTopic(topic); mTopicWrapper.addTopic(topic); mTopicWrapper.addTopicView(); } else { mTopicWrapper.deleteTopicView(); } } else { mCurrentPageIndex += 1; } mRecyclerAdapter.addDataAll(data); mRecyclerView.getAdapter().notifyDataSetChanged(); restoreTopic(topic); restoreData(data); } public void toggleAutoRefresh() { mPtr.onAutoRefresh(); } protected void onErrorDataReceived() { if (mRecyclerAdapter.getDatas().size() == 0) mReloadLayout.setVisibility(View.VISIBLE); Toast.makeText(mContext, "加载失败", Toast.LENGTH_SHORT).show(); } private boolean isNeedRefresh() { long lastRefreshTime = SpUtil.getLong(getActivity(), newUrl + "_LRT", 0L); long now = TimeUtils.getNowTime(); return (now - lastRefreshTime) > AUTO_REFRESH_THRESHOLD; } protected int getInitPageIndex() { return 0; } protected abstract RecyclerView.LayoutManager getLayoutManager(); protected abstract RecyclerView.ItemDecoration getItemDecoration(); protected abstract MultiItemTypeAdapter getAdapter(); protected abstract MultiItemTypeAdapter.OnItemClickListener getItemListener(); protected abstract String getRequestUrl(int index); protected abstract List parseData(NormalJsonInfo jsonInfo); protected abstract List parseTopic(NormalJsonInfo jsonInfo); protected abstract int parsePageCount(NormalJsonInfo jsonInfo); protected abstract void restoreData(List data); protected abstract void restoreTopic(List data); @Override protected void loadData() { //empty implements } }