package com.todayinfo.ui.fragment;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.json.JSONArray;
import org.json.JSONObject;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.handmark.pulltorefresh.library.PullToRefreshAdapterViewBase.OnPreRefreshingAnimListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnLastItemVisibleListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.jinghua.todayinformation.R;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.squareup.picasso.Picasso;
import com.todayinfo.model.ArticleItem;
import com.todayinfo.model.FocusPicture;
import com.todayinfo.model.PhonePaging;
import com.todayinfo.ui.activity.PhoneTechDetailActivity;
import com.todayinfo.ui.adapter.IndexIntoAdapter;
import com.todayinfo.ui.api.DataTask;
import com.todayinfo.ui.component.ErrorHintView;
import com.todayinfo.ui.component.ErrorHintView.OperateListener;
import com.todayinfo.ui.component.jazzviewpager.JazzyViewPager;
import com.todayinfo.ui.component.jazzviewpager.JazzyViewPager.TransitionEffect;
import com.todayinfo.ui.component.jazzviewpager.OutlineContainer;
import com.todayinfo.utils.AsyncHttpUtil;
import com.todayinfo.utils.Contacts;
import com.todayinfo.utils.JsonUtils;
import com.todayinfo.utils.MD5Utils;
/**
* 科技资讯
*
* @author zhou.ni 2015年3月18日
*/
public class PhoneTechFragment extends SuperFragment {
private View view;
private JazzyViewPager mViewPager;
private LinearLayout mIndicator;
private PullToRefreshListView mListView;
private ErrorHintView mErrorHintView;
private RelativeLayout mIndexrl;
private ImageView mIndexImage;
private MyPagerAdapter pagerAdapter;
private List<FocusPicture> picturesList = new ArrayList<FocusPicture>(); //广告界面的数据源
/** 装指引的ImageView数组 **/
private ImageView[] mIndicators;
/** 装ViewPager中ImageView的数组 **/
private ImageView[] mImageViews;
/** 图片自动切换时间 */
private static final int PHOTO_CHANGE_TIME = 2000;
private static final int MSG_CHANGE_PHOTO = 1;
private List<ArticleItem> ArticleData = new ArrayList<ArticleItem>();
private IndexIntoAdapter indexAdapter;
private boolean isViewPager = true;
private int offset = 0; //第N条数据
private boolean isPage = true; //是否还有下一页
private LinearLayout footerView; //最后一条listview
public static int VIEW_LIST = 1;
/**显示断网**/
public static int VIEW_WIFIFAILUER = 2;
/** 显示加载数据失败 **/
public static int VIEW_LOADFAILURE = 3;
public static int VIEW_LOADING = 4;
public static int VIEW_INDEXIMAGE = 5;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MSG_CHANGE_PHOTO:
int index = mViewPager.getCurrentItem();
if (index == picturesList.size() - 1) {
index = -1;
}
mViewPager.setCurrentItem(index + 1);
mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO, PHOTO_CHANGE_TIME);
}
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fm_phone_tech, container, false);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
}
/**
* 初始化控件
*/
private void initView() {
mViewPager = (JazzyViewPager) view.findViewById(R.id.phone_viewpager);
mIndicator = (LinearLayout) view.findViewById(R.id.indicator);
mListView = (PullToRefreshListView) view.findViewById(R.id.list);
mErrorHintView = (ErrorHintView) view.findViewById(R.id.hintView);
mIndexrl = (RelativeLayout) view.findViewById(R.id.index_bg);
mIndexImage = (ImageView) view.findViewById(R.id.index_image);
mIndexrl.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showLoading(VIEW_LIST);
}
});
setupIdleListener();
showLoading(VIEW_LOADING);
refreshData(true);
}
/**
* 初始化ViewPager
*/
private void initViewPager(){
mIndicators = new ImageView[picturesList.size()];
if (picturesList.size() <= 1) {
mIndicator.setVisibility(View.GONE);
}
for (int i = 0; i < mIndicators.length; i++) {
ImageView imageView = new ImageView(mContext);
LayoutParams params = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1.0f);
if (i != 0) {
params.leftMargin = 5;
}
imageView.setLayoutParams(params);
mIndicators[i] = imageView;
if (i == 0) {
mIndicators[i].setBackgroundResource(R.drawable.android_activities_cur);
} else {
mIndicators[i].setBackgroundResource(R.drawable.android_activities_gap);
}
mIndicator.addView(imageView);
}
mImageViews = new ImageView[picturesList.size()];
for (int i = 0; i < mImageViews.length; i++) {
ImageView imageView = new ImageView(mContext);
imageView.setScaleType(ScaleType.CENTER_CROP);
mImageViews[i] = imageView;
}
mViewPager.setTransitionEffect(TransitionEffect.CubeOut);
mViewPager.setCurrentItem(0);
mHandler.sendEmptyMessageDelayed(MSG_CHANGE_PHOTO, PHOTO_CHANGE_TIME);
pagerAdapter = new MyPagerAdapter();
mViewPager.setAdapter(pagerAdapter);
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
setImageBackground(arg0);
final FocusPicture item = picturesList.get(arg0);
mImageViews[arg0].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if ( !TextUtils.isEmpty(item.getPicUrl()) ) {
showProgressDialog();
showLoading(VIEW_INDEXIMAGE);
Picasso.with(mContext).load(item.getPicUrl()).placeholder(R.color.ECECEC)
.error(R.color.ECECEC).into(mIndexImage);
dismissProgressDialog();
}
}
});
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
mViewPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (picturesList.size() == 0 || picturesList.size() == 1)
return true;
else
return false;
}
});
}
/**
* 初始化listview
*/
private void setupIdleListener() {
indexAdapter = new IndexIntoAdapter(ArticleData, mActivity);
mListView.setAdapter(indexAdapter);
mListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
if (refreshView.isHeaderShown()){
defParams();
showLoading(VIEW_LOADING);
refreshData(true);
}
}
});
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ArticleItem item = ArticleData.get(position-1);
if ( item!=null && item.getType().equals("wz") ) {
Intent intent = new Intent(mContext, PhoneTechDetailActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("ArticleItem", item);
intent.putExtras(bundle);
mContext.startActivity(intent);
}
}
});
mListView.setOnPreRefreshingAnimListener(new OnPreRefreshingAnimListener() {
@Override
public void onPreRefreshingAnim() {
mListView.setFooterLoadingViewHeaderText("加载更多资讯");
}
});
mListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
@Override
public void onLastItemVisible() {
if ( isPage ) {
//滑动到底部自动刷新
refreshData(false);
} else {
//没有下一页了
mListView.onRefreshComplete();
if ( footerView == null ) {
footerView = (LinearLayout) View.inflate(mContext, R.layout.item_pull_to_refresh_footer, null);
TextView footer = (TextView) footerView.findViewById(R.id.footer);
footer.setText("到底了呢-共" + ArticleData.size() + "条资讯");
mListView.getRefreshableView().addFooterView(footerView);
}
}
}
});
}
private void refreshData(boolean clean) {
dataTask = new RefreshDataTask(dataTask.getID() + 1, clean);
dataTask.run();
}
class RefreshDataTask extends DataTask {
boolean clean = false; // 是否清空原数据
public RefreshDataTask(int id, boolean flag) {
super(id);
this.clean = flag;
}
@Override
public void run() {
// 判断是不是用户的最后操作,最后任务的ID如果比此任务的ID大则丢弃请求结果
if (getID() < dataTask.getID()) {
return;
} else {
loadIndexInfo(clean);
}
}
}
/**
* 加载首页内容
* @param flag
*/
private void loadIndexInfo(final boolean flag){
RequestParams params = new RequestParams();
String t = String.valueOf(System.currentTimeMillis() / 1000); //获取当前时间
params.put("timestamp", t); //当前时间戳
String token1 = MD5Utils.md5("d19cf361181f5a169c107872e1f5b722" + t);
params.put("token1", token1); //token1算法
params.put("apiid", 3);
params.put("module", "api_libraries_sjdbg_indexrecommend");
params.put("returnformat", "json");
params.put("encoding", "utf8");
// params.put("onetime", timeStamp); //分页用,传第一条新闻的时间戳,第一页下不用传值。
params.put("offset", offset ); //分页用,数据记录的起始行数。0为第一条记录。
params.put("rows", 10); //分页用,数据记录每次取得的行数。不传此参数则默认获取10条记录。
AsyncHttpUtil.get(Contacts.PHONE_URL, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
if ( footerView!=null ){
mListView.getRefreshableView().removeFooterView(footerView);
footerView = null;
}
mListView.onRefreshComplete();
if ( arg2!=null && arg2.length>0 ){
try {
JSONObject obj = new JSONObject(new String(arg2));
String status = obj.getString("status");
if ( TextUtils.equals("1", status) ) {
offset += 10;
//广告图片
JSONObject data = obj.getJSONObject("data");
JSONArray focusPicture = data.getJSONArray("focusPicture");
if ( isViewPager ) {
if ( focusPicture!=null ) {
List<FocusPicture> instance = JsonUtils.getInstance(FocusPicture.class, focusPicture);
if ( instance!=null && instance.size()>0){
picturesList.addAll(instance);
initViewPager();
isViewPager = false;
}
}
}
//文章列表
JSONObject articleList = data.getJSONObject("articleList");
JSONArray list = articleList.getJSONArray("list");
if ( list!=null ) {
List<ArticleItem> instance = JsonUtils.getInstance(ArticleItem.class, list);
if ( instance!=null && instance.size()>0) {
if ( flag ) {
ArticleData.clear();
}
ArticleData.addAll(instance);
showLoading(VIEW_LIST);
indexAdapter.notifyDataSetChanged();
} else {
showLoading(VIEW_LOADFAILURE);
}
}
JSONObject paging = articleList.getJSONObject("paging");
if ( paging!=null ){
PhonePaging instance = JsonUtils.getInstance(PhonePaging.class, paging);
if( instance!=null ) {
try {
int total = Integer.parseInt(instance.getTotal());
if ( offset >= total ) {
isPage = false;
} else {
isPage = true;
}
} catch (Exception e) {
isPage = true;
}
}
}
} else {
showLoading(VIEW_LOADFAILURE);
}
} catch (Exception e) {
showLoading(VIEW_LOADFAILURE);
}
} else {
showLoading(VIEW_LOADFAILURE);
}
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
showLoading(VIEW_WIFIFAILUER);
}
});
}
private void showLoading(int i){
mErrorHintView.setVisibility(View.GONE);
mListView.setVisibility(View.GONE);
mViewPager.setVisibility(View.GONE);
mIndicator.setVisibility(View.GONE);
mIndexrl.setVisibility(View.GONE);
switch(i){
case 1:
mErrorHintView.hideLoading();
mViewPager.setVisibility(View.VISIBLE);
mIndicator.setVisibility(View.VISIBLE);
mListView.setVisibility(View.VISIBLE);
break;
case 2:
mErrorHintView.hideLoading();
mErrorHintView.netError(new OperateListener() {
@Override
public void operate() {
defParams();
showLoading(VIEW_LOADING);
refreshData(true);
}
});
break;
case 3:
mErrorHintView.hideLoading();
mErrorHintView.loadFailure(new OperateListener() {
@Override
public void operate() {
defParams();
showLoading(VIEW_LOADING);
refreshData(true);
}
});
break;
case 4:
mErrorHintView.loadingData();
break;
case 5:
mErrorHintView.hideLoading();
mIndexrl.setVisibility(View.VISIBLE);
break;
}
}
/**
* 恢复默认参数
*/
private void defParams(){
offset = 0;
isPage = true;
}
/**
* 设置选中的tip的背景
*
* @param selectItemsIndex
*/
private void setImageBackground(int selectItemsIndex) {
for (int i = 0; i < mIndicators.length; i++) {
if (i == selectItemsIndex) {
mIndicators[i]
.setBackgroundResource(R.drawable.android_activities_cur);
} else {
mIndicators[i]
.setBackgroundResource(R.drawable.android_activities_gap);
}
}
}
@Override
public void retry() {
}
@Override
public void netError() {
}
@Override
public void pwdError() {
}
class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return mImageViews.length;
}
@Override
public boolean isViewFromObject(View view, Object obj) {
if (view instanceof OutlineContainer) {
return ((OutlineContainer) view).getChildAt(0) == obj;
} else {
return view == obj;
}
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(mViewPager
.findViewFromObject(position));
}
@Override
public Object instantiateItem(View container, int position) {
FocusPicture item = picturesList.get(position);
if ( !TextUtils.isEmpty(item.getPicUrl()) ){
Picasso.with(mContext).load(item.getPicUrl()).placeholder(R.color.ECECEC).error(R.color.ECECEC).into(mImageViews[position]);
}
((ViewPager) container).addView(mImageViews[position], 0);
mViewPager.setObjectForPosition(mImageViews[position], position);
return mImageViews[position];
}
}
}