package com.todayinfo.ui.activity; 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.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Xml; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; 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.squareup.picasso.Picasso; import com.todayinfo.model.NewItem; import com.todayinfo.ui.component.ErrorHintView; import com.todayinfo.ui.component.ErrorHintView.OperateListener; import com.todayinfo.utils.AsyncHttpUtil; import com.todayinfo.utils.DateUtils; import com.todayinfo.utils.LogUtil; /** * 新闻焦点 * * @author zhou.ni 2015年3月17日 */ public class NewsFocusActivity extends SuperActivity { private PullToRefreshListView mListView; private ErrorHintView mErrorHintView; private static final String PATH = "http://wcf.open.cnblogs.com/news/recommend/paged/"; private int pageNext = 1; //下一页页码 private boolean flag = false; private NewsFocusAdapter adapter; private List<NewItem> mList = new ArrayList<NewItem>(); 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news_focus); getWindow().setBackgroundDrawable(null); initView(); } private void initView() { RelativeLayout headView = (RelativeLayout) this.findViewById(R.id.head); headView.findViewById(R.id.back_left).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } });; TextView title = (TextView) headView.findViewById(R.id.head_title); title.setText("焦点新闻"); mListView = (PullToRefreshListView) this.findViewById(R.id.list); mErrorHintView = (ErrorHintView) this.findViewById(R.id.hintView); setUpPullToList(); showLoading(VIEW_LOADING); loadNewsFocusInfo(true); } /** * 设置listview的下拉刷新 */ private void setUpPullToList(){ adapter = new NewsFocusAdapter(); mListView.setAdapter(adapter); mListView.setOnRefreshListener(new OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { if (refreshView.isHeaderShown()){ defParams(); loadNewsFocusInfo(true); } } }); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { NewItem item = mList.get(position-1); Intent intent = new Intent(mContext, NewsDetailActivity.class); Bundle info = new Bundle(); info.putSerializable("item", item); intent.putExtras(info); startActivity(intent); } }); mListView.setOnPreRefreshingAnimListener(new OnPreRefreshingAnimListener() { @Override public void onPreRefreshingAnim() { mListView.setFooterLoadingViewHeaderText("加载更多博客"); } }); mListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() { @Override public void onLastItemVisible() { if ( pageNext<12 ) { //滑动到底部自动刷新 flag = false; loadNewsFocusInfo(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("到底了呢-共" + mList.size() + "条资讯"); mListView.getRefreshableView().addFooterView(footerView); } } } }); } /** * 加载新闻焦点的数据 */ private void loadNewsFocusInfo(final boolean clean){ String url = PATH + pageNext + "/10"; AsyncHttpUtil.get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int code, Header[] headers, byte[] responseBody) { if ( footerView!=null ){ mListView.getRefreshableView().removeFooterView(footerView); footerView = null; } mListView.onRefreshComplete(); try { showLoading(VIEW_LIST); if ( clean ) { mList.clear(); } ByteArrayInputStream inputStream = new ByteArrayInputStream(responseBody); parseNewsFocusXml(inputStream); adapter.notifyDataSetChanged(); pageNext ++; } catch (Exception e) { e.printStackTrace(); LogUtil.d("error", "hots news XmlPullParserException error"); 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 parseNewsFocusXml(InputStream in) throws XmlPullParserException, IOException { XmlPullParser parser = Xml.newPullParser(); parser.setInput(in, "UTF-8"); int event = parser.getEventType(); NewItem 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 NewItem(); } 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 ("link".equals(parser.getName())) { String link = parser.getAttributeValue(1); //获得第二个属性值 item.setLink(link); } 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); } else if ("topicIcon".equals(parser.getName())) { String topicIcon = parser.nextText(); item.setTopicIcon(topicIcon); } else if ("sourceName".equals(parser.getName())) { String sourceName = parser.nextText(); item.setSourceName(sourceName); } } break; case XmlPullParser.TEXT: break; case XmlPullParser.END_TAG: if ("entry".equals(parser.getName())) { mList.add(item); } break; } event = parser.next(); } } private void defParams(){ pageNext = 1; flag = false; } private void showLoading(int i){ mErrorHintView.setVisibility(View.GONE); mListView.setVisibility(View.GONE); switch(i){ case 1: mErrorHintView.hideLoading(); mListView.setVisibility(View.VISIBLE); break; case 2: mErrorHintView.hideLoading(); mErrorHintView.netError(new OperateListener() { @Override public void operate() { defParams(); showLoading(VIEW_LOADING); loadNewsFocusInfo(true); } }); break; case 3: mErrorHintView.hideLoading(); mErrorHintView.loadFailure(new OperateListener() { @Override public void operate() { defParams(); showLoading(VIEW_LOADING); loadNewsFocusInfo(true); } }); break; case 4: mErrorHintView.loadingData(); break; } } @Override public void retry() { } @Override public void netError() { } @Override protected void obtainInfo() { } class NewsFocusAdapter 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(mContext, R.layout.item_news_focus_lv, null); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.sourceName = (TextView) convertView.findViewById(R.id.sourceName); holder.published = (TextView) convertView.findViewById(R.id.publish); holder.diggsTv = (TextView) convertView.findViewById(R.id.diggs_tx); holder.commentsTv = (TextView) convertView.findViewById(R.id.comments); holder.image = (ImageView) convertView.findViewById(R.id.image); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } NewItem item = mList.get(position); holder.title.setText(item.getTitle()); holder.sourceName.setText("" + item.getSourceName()); if( !TextUtils.isEmpty(item.getTopicIcon()) ) { Picasso.with(mContext).load(item.getTopicIcon()).placeholder(R.color.ECECEC).error(R.color.ECECEC).into(holder.image); } if ( !TextUtils.isEmpty(item.getPublished()) ) { holder.published.setText( DateUtils.convertGMTToLoacale(item.getPublished()) ); } 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(""); } return convertView; } } static class ViewHolder { TextView title; TextView published; TextView diggsTv; TextView sourceName; TextView commentsTv; ImageView image; } }