package com.todayinfo.ui.fragment; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.http.Header; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Xml; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import com.handmark.pulltorefresh.library.PullToRefreshBase; 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.squareup.picasso.Picasso; import com.todayinfo.model.BlogItem; import com.todayinfo.ui.activity.BolgDetailActivity; import com.todayinfo.ui.component.CircleImageView; import com.todayinfo.ui.component.ErrorHintView; import com.todayinfo.ui.component.ErrorHintView.OperateListener; import com.todayinfo.utils.AsyncHttpUtil; import com.todayinfo.utils.DateUtils; /** * 最新博客 * * @author zhou.ni 2015年5月17日 */ public class HotsBolgLayout extends RelativeLayout{ private static final String TAG = "FreshBolgLayout"; private Activity mActivity; private PullToRefreshListView hotsListView; private ErrorHintView mErrorHintView; private static final String HOTS_PATH = "http://wcf.open.cnblogs.com/blog/TenDaysTopDiggPosts/100"; private boolean flag = false; private List<BlogItem> mList = new ArrayList<BlogItem>(); private HotsBolgAdapter adapter; 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 HotsBolgLayout(Context context) { super(context); mActivity = (Activity) getContext(); initView(); } public HotsBolgLayout(Context context, AttributeSet attrs) { super(context, attrs); mActivity = (Activity) getContext(); initView(); } public HotsBolgLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mActivity = (Activity) getContext(); initView(); } /** * 初始化控件 */ private void initView() { View view = View.inflate(getContext(), R.layout.layout_fresh_blog, this); hotsListView = (PullToRefreshListView) view.findViewById(R.id.fresh_blog_list); mErrorHintView = (ErrorHintView) view.findViewById(R.id.hintView); setUpPullToList(); } /** * 设置listview的下拉刷新 */ private void setUpPullToList(){ adapter = new HotsBolgAdapter(); hotsListView.setAdapter(adapter); hotsListView.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { if (refreshView.isHeaderShown()){ flag = false; loadHotsBolgInfo(true); } } }); hotsListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { BlogItem item = mList.get(position-1); Intent intent = new Intent(mActivity, BolgDetailActivity.class); Bundle info = new Bundle(); info.putSerializable("item", item); intent.putExtras(info); mActivity.startActivity(intent); } }); } /** * 加载最新博客信息 */ public void loadHotsBolgInfo(final boolean clean){ showLoading(VIEW_LOADING); AsyncHttpUtil.get(HOTS_PATH, new AsyncHttpResponseHandler() { @Override public void onSuccess(int code, Header[] headers, byte[] responseBody) { hotsListView.onRefreshComplete(); try { showLoading(VIEW_LIST); if ( clean ) { mList.clear(); } ByteArrayInputStream inputStream = new ByteArrayInputStream(responseBody); parseFreshBolgXml(inputStream); adapter.notifyDataSetChanged(); }catch (Exception e) { e.printStackTrace(); showLoading(VIEW_LOADFAILURE); } } @Override public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) { showLoading(VIEW_WIFIFAILUER); } }); } /** * 解析最新博客 * @param in * @throws IOException * @throws XmlPullParserException */ private void parseFreshBolgXml(InputStream in) throws XmlPullParserException, IOException { XmlPullParser parser = Xml.newPullParser(); parser.setInput(in, "UTF-8"); int event = parser.getEventType(); BlogItem item = null; while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: if ("entry".equals(parser.getName())) { flag = true; item = new BlogItem(); } if (flag) { if ("id".equals(parser.getName())) { String id = parser.nextText(); item.setId(id); } else if ("title".equals(parser.getName())) { String title = parser.nextText(); item.setTitle(title); } else if ("summary".equals(parser.getName())) { String summary = parser.nextText(); item.setSummary(summary); } else if ("published".equals(parser.getName())) { String published = parser.nextText(); item.setPublished(published); } else if ("updated".equals(parser.getName())) { String updated = parser.nextText(); item.setUpdated(updated); }else if("name".equals(parser.getName())){ String name = parser.nextText(); item.setName(name); }else if("uri".equals(parser.getName())){ String uri = parser.nextText(); item.setUri(uri); }else if("avatar".equals(parser.getName())){ String avatar = parser.nextText(); item.setAvatar(avatar); Log.i(TAG, "---------------->>>"+avatar); } else if ("link".equals(parser.getName())) { String href = parser.getAttributeValue(1); item.setHref(href); } else if ("diggs".equals(parser.getName())) { String diggs = parser.nextText(); item.setDiggs(diggs); } else if ("views".equals(parser.getName())) { String views = parser.nextText(); item.setViews(views); } else if ("comments".equals(parser.getName())) { String comments = parser.nextText(); item.setComments(comments); } } break; case XmlPullParser.TEXT: break; case XmlPullParser.END_TAG: if ("entry".equals(parser.getName())) { mList.add(item); } break; } event = parser.next(); } } /** * 显示正在加载界面 * * @param i */ private void showLoading(int i){ mErrorHintView.setVisibility(View.GONE); hotsListView.setVisibility(View.GONE); switch(i){ case 1: mErrorHintView.hideLoading(); hotsListView.setVisibility(View.VISIBLE); break; case 2: mErrorHintView.hideLoading(); mErrorHintView.netError(new OperateListener() { @Override public void operate() { showLoading(VIEW_LOADING); loadHotsBolgInfo(true); } }); break; case 3: mErrorHintView.hideLoading(); mErrorHintView.loadFailure(new OperateListener() { @Override public void operate() { showLoading(VIEW_LOADING); loadHotsBolgInfo(true); } }); break; case 4: mErrorHintView.loadingData(); break; } } class HotsBolgAdapter extends BaseAdapter { @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if ( convertView == null ) { convertView = View.inflate(mActivity, R.layout.item_fresh_bolg_lv, null); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.uPic = (CircleImageView) convertView.findViewById(R.id.image); holder.name = (TextView) convertView.findViewById(R.id.name); holder.published = (TextView) convertView.findViewById(R.id.publish); holder.summary = (TextView) convertView.findViewById(R.id.summary); holder.viewsTv = (TextView) convertView.findViewById(R.id.views_tx); holder.diggsTv = (TextView) convertView.findViewById(R.id.diggs_tx); holder.commentsTv = (TextView) convertView.findViewById(R.id.comment_tx); holder.diggs = (LinearLayout) convertView.findViewById(R.id.hots_diggs); holder.views = (LinearLayout) convertView.findViewById(R.id.hots_views); holder.comment = (LinearLayout) convertView.findViewById(R.id.hots_comment); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } BlogItem item = mList.get(position); holder.title.setText(item.getTitle()); holder.name.setText(item.getName()); holder.summary.setText(item.getSummary()); if( !TextUtils.isEmpty(item.getAvatar()) ) { Picasso.with(mActivity).load(item.getAvatar()).placeholder(R.drawable.touxiang).error(R.drawable.touxiang).into(holder.uPic); } if ( !TextUtils.isEmpty(item.getPublished()) ) { holder.published.setText( DateUtils.convertGMTToLoacale(item.getPublished()) ); } if ( !TextUtils.isEmpty(item.getViews()) ) { holder.viewsTv.setText(item.getViews()); } else { holder.viewsTv.setText(""); } if ( !TextUtils.isEmpty(item.getComments()) ) { holder.commentsTv.setText(item.getComments()); } else { holder.commentsTv.setText(""); } if ( !TextUtils.isEmpty(item.getDiggs()) ) { holder.diggsTv.setText(item.getDiggs()); } else { holder.diggsTv.setText(""); } // if(position%2 == 0){ // convertView.setBackgroundResource(R.color.white); // }else{ // convertView.setBackgroundResource(R.color.hotsblogsbg); // } return convertView; } } static class ViewHolder { TextView title; CircleImageView uPic; TextView summary; TextView published; TextView viewsTv; TextView diggsTv; TextView name; TextView commentsTv; TextView textViews; LinearLayout views; LinearLayout diggs; LinearLayout comment; } }