package com.mzoneapp.zjjmb.ui;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import org.json.JSONArray;
import org.json.JSONObject;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.actionbarsherlock.app.SherlockListFragment;
import com.github.ignition.core.tasks.IgnitedAsyncTask;
import com.github.ignition.support.http.IgnitedHttp;
import com.github.ignition.support.http.IgnitedHttpResponse;
import com.mzoneapp.ui.widget.PullToRefreshListView;
import com.mzoneapp.zjjmb.R;
import com.mzoneapp.zjjmb.adapter.ArticleAdapter;
import com.mzoneapp.zjjmb.api.ApiConstants;
import com.mzoneapp.zjjmb.api.Article;
/**
* Fragment that displays the news headlines for a particular news category.
*
* This Fragment displays a list with the news headlines for a particular news category.
* When an item is selected, it notifies the configured listener that a headlines was selected.
*/
public class HeadlinesFragment extends SherlockListFragment implements OnItemClickListener,OnScrollListener {
// The list adapter for the list we are displaying
ArticleAdapter adapter;
private IgnitedHttp http;
private ListView listView;
private String type;
// private boolean isLoaded = false;
private boolean isNull = false;
// The listener we are to notify when a headline is selected
OnHeadlineSelectedListener mHeadlineSelectedListener = null;
OnRefreshCallBack onRefeshCallBack;
public interface OnRefreshCallBack {
void setProgressBar(boolean refresh);
}
/**
* Represents a listener that will be notified of headline selections.
*/
public interface OnHeadlineSelectedListener {
/**
* Called when a given headline is selected.
* @param index the index of the selected headline.
*/
public void onHeadlineSelected(int index);
}
public void setRefreshCallBack(OnRefreshCallBack onRefeshCallBack) {
this.onRefeshCallBack = onRefeshCallBack;
}
/**
* Default constructor required by framework.
*/
public HeadlinesFragment() {
super();
}
// public HeadlinesFragment(Activity activity){
// }
//
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_list, null);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// if(isLoaded) return;
type = getArguments().getString(ApiConstants.TYPE);
http = new IgnitedHttp(getActivity());
listView = getListView();
// listView.setCacheColorHint(0);
// listView.setDivider(null);
adapter = new ArticleAdapter(getActivity(),getListView());
setListAdapter(adapter);
listView.setOnItemClickListener(this);
listView.setOnScrollListener(this);
((PullToRefreshListView) listView).setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {
@Override
public void onRefresh() {
refresh();
}
});
loadNextPage(true);
// isLoaded = true;
}
private void loadNextPage(final boolean clearBefore) {
if(!clearBefore)
adapter.setIsLoadingData(true);
else{
if(null != this.onRefeshCallBack){
this.onRefeshCallBack.setProgressBar(true);
}
}
IgnitedAsyncTask<MainActivity, Void, Void, Void> task = new IgnitedAsyncTask<MainActivity, Void, Void, Void>() {
@Override
public Void run(Void... params) throws Exception {
int start = adapter.getItemCount();
int pageno = start / ApiConstants.DEFAULT_SIZE + 1;
// refresh when clearBefore is true
if(clearBefore) pageno = 1;
String url = ApiConstants.instance().
getListUrl(type, pageno);
IgnitedHttpResponse response = http.get(url).retries(3).expecting(200).send();
String responseBody = response.getResponseBodyAsString();
// Object result = null;
responseBody = responseBody.trim();
// if(responseBody.startsWith("{") || responseBody.startsWith("[")) {
// result = new JSONTokener(responseBody).nextValue();
// }
JSONObject tmp = new JSONObject(responseBody);
JSONArray jsonArray = tmp.getJSONArray("items");
int length = jsonArray.length();
// reset isNull;
isNull = false;
// no result, not load next time
if( 0 == length) {
isNull = true;
return null;
}
// if( length < ApiConstants.DEFAULT_SIZE) isNull = true;
ArrayList<Article> list = new ArrayList<Article>();
for(int i = 0; i < length; i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
Article line = new Article();
line.id = jsonObject.getString("id");
line.author = jsonObject.getString("author");
line.issuedate = jsonObject.getString("issuedate");
line.title = jsonObject.getString("title");
line.type = jsonObject.getString("type");
String imgurl = jsonObject.getString("imgurl");
if( null != imgurl &&imgurl.startsWith("http"))
line.images = new String[]{imgurl};
line.desc = URLDecoder.decode(jsonObject.getString("content"), "utf-8");
list.add(line);
}
if(clearBefore)
adapter.getData().clear();
adapter.getData().addAll(list);
// TODO 更完善的异常处理
// isNull = true;
// throw new JSONException("Unexpected type " + result.getClass().getName());
return null;
}
@Override
public boolean onTaskCompleted(Void result) {
onRefreshComplete();
adapter.setIsLoadingData(false);
adapter.notifyDataSetChanged();
if(clearBefore){
listView.setSelection(0);
if(null != onRefeshCallBack){
onRefeshCallBack.setProgressBar(false);
}
}
return true;
}
@Override
public boolean onTaskFailed(Exception ex){
// TODO
Article line = new Article();
line.id = "1";
line.title = "Error";
line.author = "";
line.issuedate = "";
line.desc = "网络数据加载错误";
line.type = type;
adapter.getData().add(line);
return true;
}
};
task.execute();
}
private void onRefreshComplete(){
if(listView.isEnabled())
((PullToRefreshListView)listView).onRefreshComplete("最近更新:"+new Date().toLocaleString());
}
public void refresh(){
loadNextPage(true);
}
/**
* Sets the listener that should be notified of headline selection events.
* @param listener the listener to notify.
*/
public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener listener) {
mHeadlineSelectedListener = listener;
}
/**
* Handles a click on a headline.
*
* This causes the configured listener to be notified that a headline was selected.
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (null != mHeadlineSelectedListener) {
mHeadlineSelectedListener.onHeadlineSelected(position);
}
if(adapter.getData().size() > position -1){
Article article = adapter.getData().get(position-1);
Intent i = new Intent(getActivity(), ArticleActivity.class);
i.putExtras(Article.convertArticleToBundle(article));
// startActivity(i);
startActivityForResult(i, 1);
getActivity().overridePendingTransition(R.anim.slide_in_up,R.anim.slide_out_down);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode ==1 && resultCode ==1 && data != null){
String mArticleId = data.getStringExtra("id");
SharedPreferences settings = getActivity().getSharedPreferences("articel_read_ids", 0);
boolean flag = settings.getBoolean(mArticleId, false);
if(!flag){
settings.edit().putBoolean(mArticleId, true).commit();
adapter.notifyDataSetChanged();
}
}
}
/** Sets choice mode for the list
*
* @param selectable whether list is to be selectable.
*/
public void setSelectable(boolean selectable) {
if (selectable) {
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
else {
listView.setChoiceMode(ListView.CHOICE_MODE_NONE);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
((PullToRefreshListView)listView).onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
if (!isNull && adapter.shouldRequestNextPage(firstVisibleItem, visibleItemCount, totalItemCount)) {
loadNextPage(false);
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
((PullToRefreshListView)getListView()).onScrollStateChanged(view, scrollState);
}
}