package com.lean56.andplug.fragment;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import com.lean56.andplug.R;
import com.lean56.andplug.adapter.LoadMoreAdapter;
import com.lean56.andplug.network.OkHttpCallback;
import com.lean56.andplug.network.ResponsePage;
import com.lean56.andplug.view.ExceptionView;
import com.lean56.andplug.view.recycler.SuperRecyclerView;
import com.squareup.okhttp.Request;
import java.util.ArrayList;
import java.util.List;
/**
* PagedFragment
*
* @author Charles
*/
public abstract class PagedFragment<E> extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener, LoadMoreAdapter.ILoadMoreCallback {
/**
* List items provided
*/
protected List<E> mItems = new ArrayList<>();
/**
* Is the list currently shown?
*/
protected boolean mListShown;
/**
* Recycler View
*/
protected SuperRecyclerView mSuperRecyclerView;
/**
* Progress bar
*/
ProgressBar mProgressBar;
/**
* exception view
*/
ExceptionView mExceptionView;
SwipeRefreshLayout mSwipeLayout;
protected int mCurrentPageNo = 1;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!mItems.isEmpty())
setListShown(true, false);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.paged, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initArgument();
// init views
mProgressBar = (ProgressBar) view.findViewById(R.id.pb_loading);
mExceptionView = (ExceptionView) view.findViewById(R.id.view_exception);
mSwipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.ptr_layout);
mSwipeLayout.setColorSchemeResources(com.lean56.andplug.R.color.swipe_refresh_start, com.lean56.andplug.R.color.swipe_refresh_end);
mSuperRecyclerView = (SuperRecyclerView) view.findViewById(R.id.srv_paged);
mSuperRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mSuperRecyclerView.setProgressAdapter(createAdapter(mItems));
mSuperRecyclerView.setRefreshListener(this);
getListAdapter().setLoadMoreCallback(this);
// init and send network
initHttpCallback();
sendHttpRequest();
}
/**
* Create adapter to display items
*
* @param items
* @return adapter
*/
protected abstract RecyclerView.Adapter createAdapter(final List<E> items);
/**
* Set the list to be shown
*/
protected void showList() {
setListShown(true, isResumed());
}
/**
* Get list adapter
*
* @return list adapter
*/
protected LoadMoreAdapter getListAdapter() {
if (mSuperRecyclerView != null) {
return (LoadMoreAdapter) mSuperRecyclerView.getAdapter();
} else
return null;
}
/**
* Set list shown or progress bar show
*
* @param shown
* @param animate
* @return this fragment
*/
public PagedFragment<E> setListShown(final boolean shown, final boolean animate) {
if (!isUsable())
return this;
if (shown == mListShown) {
if (shown)
// List has already been shown so hide/show the empty view with no fade effect
if (mItems.isEmpty())
hide(mSuperRecyclerView).show(mExceptionView);
else
hide(mExceptionView).show(mSuperRecyclerView);
return this;
}
mListShown = shown;
if (shown)
if (!mItems.isEmpty())
hide(mProgressBar).hide(mExceptionView).fadeIn(mSuperRecyclerView, animate).show(mSuperRecyclerView);
else
hide(mProgressBar).hide(mSuperRecyclerView).fadeIn(mExceptionView, animate).show(mExceptionView);
else
hide(mSuperRecyclerView).hide(mExceptionView).fadeIn(mProgressBar, animate).show(mProgressBar);
return this;
}
protected OkHttpCallback mOkHttpCallback;
protected abstract void sendHttpRequest();
protected abstract void initHttpCallback();
protected void initArgument() {
}
protected void onResponseError(Request request, Exception e) {
}
protected void onResponseSuccess(List<E> items, ResponsePage page) {
if (null == page)
return;
if (page.getPageNo() == 1) {
mItems = items;
getListAdapter().replaceAll(mItems);
showList();
} else {
mItems.addAll(items);
getListAdapter().addAll(items);
}
if (page.hasNextPage()) {
mCurrentPageNo = page.getPageNo() + 1;
getListAdapter().setLoadingCompleted(false);
} else {
getListAdapter().setLoadingCompleted(true);
}
}
public void refresh() {
mCurrentPageNo = 1;
sendHttpRequest();
}
// [+] LoadMoreListener
@Override
public void onRefresh() {
mCurrentPageNo = 1;
sendHttpRequest();
}
@Override
public void loadMore(int position) {
sendHttpRequest();
}
// [-] LoadMoreListener
@Override
public void onDestroyView() {
mListShown = false;
mProgressBar = null;
mSuperRecyclerView = null;
mExceptionView = null;
super.onDestroyView();
}
}