package com.refactech.driibo.ui.fragment;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.haarman.listviewanimations.swinginadapters.AnimationAdapter;
import com.refactech.driibo.R;
import com.refactech.driibo.data.GsonRequest;
import com.refactech.driibo.ui.MainActivity;
import com.refactech.driibo.ui.adapter.CardsAnimationAdapter;
import com.refactech.driibo.util.ListViewUtils;
import com.refactech.driibo.util.CommonUtils;
import com.refactech.driibo.view.LoadingFooter;
import uk.co.senab.actionbarpulltorefresh.library.PullToRefreshAttacher;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.Toast;
/**
* Created by Issac on 7/31/13.
*/
public abstract class BasePageListFragment<T> extends BaseFragment implements
PullToRefreshAttacher.OnRefreshListener {
private BaseAdapter mAdapter;
protected ListView mListView;
protected int mPage = 1;
private PullToRefreshAttacher mPullToRefreshAttacher;
private LoadingFooter mLoadingFooter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View contentView = inflater.inflate(getContentViewResId(), null);
mListView = (ListView) contentView.findViewById(R.id.listView);
View header = new View(getActivity());
mPullToRefreshAttacher = ((MainActivity) getActivity()).getPullToRefreshAttacher();
mPullToRefreshAttacher.setRefreshableView(mListView, this);
mLoadingFooter = new LoadingFooter(getActivity());
mListView.addHeaderView(header);
mListView.addFooterView(mLoadingFooter.getView());
mAdapter = newAdapter();
AnimationAdapter animationAdapter = new CardsAnimationAdapter(mAdapter);
animationAdapter.setListView(mListView);
mListView.setAdapter(animationAdapter);
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if (mLoadingFooter.getState() == LoadingFooter.State.Loading
|| mLoadingFooter.getState() == LoadingFooter.State.TheEnd) {
return;
}
if (firstVisibleItem + visibleItemCount >= totalItemCount
&& totalItemCount != 0
&& totalItemCount != mListView.getHeaderViewsCount()
+ mListView.getFooterViewsCount() && mListView.getCount() > 0) {
loadNextPage();
}
}
});
return contentView;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mPullToRefreshAttacher.getHeaderTransformer().onConfigurationChanged(getActivity());
}
protected void loadData(final int page) {
final boolean isRefreshFromTop = page == 1;
if (!mPullToRefreshAttacher.isRefreshing() && isRefreshFromTop) {
mPullToRefreshAttacher.setRefreshing(true);
}
executeRequest(new GsonRequest<T>(getUrl(page), getResponseDataClass(), null,
new Response.Listener<T>() {
@Override
public void onResponse(final T response) {
CommonUtils.executeAsyncTask(new AsyncTask<Object, Object, Object>() {
@Override
protected Object doInBackground(Object... params) {
processData(response);
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
if (isRefreshFromTop) {
mPullToRefreshAttacher.setRefreshComplete();
} else {
mLoadingFooter.setState(LoadingFooter.State.Idle, 3000);
}
}
});
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(getActivity(), R.string.refresh_list_failed,
Toast.LENGTH_SHORT).show();
if (isRefreshFromTop) {
mPullToRefreshAttacher.setRefreshComplete();
} else {
mLoadingFooter.setState(LoadingFooter.State.Idle, 3000);
}
}
}));
}
protected void loadNextPage() {
mLoadingFooter.setState(LoadingFooter.State.Loading);
loadData(mPage + 1);
}
protected void loadFirstPage() {
loadData(1);
}
public void loadFirstPageAndScrollToTop() {
ListViewUtils.smoothScrollListViewToTop(mListView);
loadFirstPage();
}
@Override
public void onRefreshStarted(View view) {
loadFirstPage();
}
protected BaseAdapter getAdapter() {
return mAdapter;
}
protected abstract int getContentViewResId();
protected abstract BaseAdapter newAdapter();
protected abstract void processData(T response);
protected abstract String getUrl(int page);
protected abstract Class getResponseDataClass();
}