package com.campus.prime.ui;
import java.util.List;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.content.Loader;
import android.text.format.DateUtils;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import com.campus.prime.core.PageBase;
import com.campus.prime.core.service.CampusService;
import com.campus.prime.core.service.MessageService;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
public abstract class PagedItemFragment<E> extends ItemListFragment<E>{
public static final int UP = 2;
public static final int DOWN = 3;
/**
* Entity Page
*/
protected PageBase currentPage;
/**
* Scroll direction
*/
protected int direction = 2;
protected PageBase getCurrentPage(){
return currentPage;
}
protected void setCurrentPage(PageBase page){
this.currentPage = page;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
// Configure PullToRefreshListView
listView.setMode(Mode.DISABLED);
listView.setOnScrollListener(new OnScrollListener() {
private int firstItem;
private int lastItem;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if(firstItem == 0 && scrollState == SCROLL_STATE_IDLE){
direction = UP;
}else if(lastItem == items.size() && scrollState == SCROLL_STATE_IDLE){
direction = DOWN;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
firstItem = firstVisibleItem;
lastItem = firstVisibleItem + visibleItemCount - 2;
}
});
listView.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// TODO Auto-generated method stub
String label = DateUtils.formatDateTime(getActivity().getApplicationContext(), System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
// Update the LastUpdatedLabel
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
new GetDataTask().execute();
}
});
}
@Override
public Loader<List<E>> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
// intialize MessageService
return new AsyncLoader<List<E>>(getActivity()) {
@Override
protected List<E> loadData() {
// TODO Auto-generated method stub
return load();
}
};
}
@Override
public void onLoadFinished(Loader<List<E>> arg0, List<E> arg1) {
// TODO Auto-generated method stub
super.onLoadFinished(arg0, arg1);
if(!isUsable())
return;
this.items = arg1;
getListAdapter().setItems(items);
showList();
// set mode of PullToRefereshListView
if(items != null)
listView.setMode(Mode.BOTH);
}
public class GetDataTask extends AsyncTask<Void,Void,List<E>>{
@Override
protected List<E> doInBackground(Void... arg0) {
// TODO Auto-generated method stub
if(direction == UP)
return first();
else if(direction == DOWN)
return next();
else
return null;
}
@SuppressWarnings("unchecked")
@Override
protected void onPostExecute(List<E> result) {
// TODO Auto-generated method stub
if(!isUsable())
return;
if(direction == UP){
items = result;
}else if(direction == DOWN){
//items.add(items.size(),(E)result);
if(result != null){
items.addAll(result);
}
}
getListAdapter().setItems(items);
showList();
listView.onRefreshComplete();
super.onPostExecute(result);
}
}
/**
* refresh messages
*/
/**
* async load data
* @return
*/
protected abstract List<E> load();
/**
* get first page
*/
protected List<E> first(){
return load();
}
/**
* get next page
*/
protected abstract List<E> next();
/**
* has next page
*/
protected boolean hasNext(){
return (currentPage == null || currentPage.getNext() == null) ? false : true;
}
}