qq 国内新闻
http://news.qq.com/c/816guonei_1.htm
http://news.qq.com/c/816guonei_2.htm
........
<a target="_blank" class="pic" href="/a/20160430/004728.htm"> <img class="picto" src="http://img1.gtimg.com/news/pics/hv1/130/103/2061/134042920_small.jpg"></a> <em class="f14 l24"> <a target="_blank" class="linkto" href="/a/20160430/004728.htm"> 学校老师私开小卖部 带方便面进校遭食堂老板殴打 </a> </em> <p class="l22"> 达州市渠县三汇中学王道明老师的妻子邓女士,在谈到丈夫与学校食堂承包商刘志勇,因携带方便面进校门发生纠纷继而被刘志勇打一事时,双眼恍惚,充满了恐惧。 </p> <a target=\"_blank\" class=\"pic\" href=\"([^\"]*)\"> <img class=\"picto\" src=\"([^\"]*)\"> </a> <em class=\"f14 l24\"> <a target=\"_blank\" class=\"linkto\" href=\"[^\"]*\"> ([^</a>]*) </a> </em> <p class=\"l22\"> ([^</p>]*) </p>
demo 如图:
根据返回内容 进行正则匹配,获取 需要布局信息 QQNewsItemEntity
(图片展示不好,可以查看图片附件)
package com.curiousby.fitnessandappointment.utils; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.curiousby.fitnessandappointment.entity.QQNewsItemEntity; public class QQNewsMatcherPerformer { public static List<QQNewsItemEntity> parseHtmlData(String result) { List<QQNewsItemEntity> list = new ArrayList<QQNewsItemEntity>(); Pattern pattern = Pattern .compile("<a target=\"_blank\" class=\"pic\" href=\"([^\"]*)\"><img class=\"picto\" src=\"([^\"]*)\"></a><em class=\"f14 l24\"><a target=\"_blank\" class=\"linkto\" href=\"[^\"]*\">([^</a>]*)</a></em><p class=\"l22\">([^</p>]*)</p>"); Matcher matcher = pattern.matcher(result); while (matcher.find()) { QQNewsItemEntity model = new QQNewsItemEntity(); model.setNewsDetailUrl(matcher.group(1).trim()); model.setUrlImgAddress(matcher.group(2).trim()); model.setNewsTitle(matcher.group(3).trim()); model.setNewsSummary(matcher.group(4).trim()); list.add(model); } return list; } }
package com.curiousby.fitnessandappointment.entity; public class QQNewsItemEntity { //新闻详情地址 private String newsDetailUrl; //新闻图片地址 private String urlImgAddress; //新闻标题 private String newsTitle; //新闻概要 private String newsSummary; public String getUrlImgAddress() { return urlImgAddress; } public void setUrlImgAddress(String urlImgAddress) { this.urlImgAddress = urlImgAddress; } public String getNewsDetailUrl() { return newsDetailUrl; } public void setNewsDetailUrl(String newsDetailUrl) { this.newsDetailUrl = newsDetailUrl; } public String getNewsTitle() { return newsTitle; } public void setNewsTitle(String newsTitle) { this.newsTitle = newsTitle; } public String getNewsSummary() { return newsSummary; } public void setNewsSummary(String newsSummary) { this.newsSummary = newsSummary; } }
package com.curiousby.fitnessandappointment.request.http; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.json.JSONObject; import android.util.Log; import com.android.volley.Request.Method; import com.android.volley.NetworkResponse; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.HttpHeaderParser; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.curiousby.fitnessandappointment.MyApplication; import com.curiousby.fitnessandappointment.constants.Constants; import com.curiousby.fitnessandappointment.entity.FeedAllEntity; import com.curiousby.fitnessandappointment.entity.FeedCommentEntity; import com.curiousby.fitnessandappointment.entity.FeedZanEntity; import com.curiousby.fitnessandappointment.entity.QueryResultJson; import com.curiousby.fitnessandappointment.quote.volley.GsonRequest; import com.curiousby.fitnessandappointment.request.dbmanager.QQNewsHttpManager; import com.curiousby.fitnessandappointment.request.dbmanager.TrendHttpManager; import com.curiousby.fitnessandappointment.utils.JSONUtil; import com.curiousby.fitnessandappointment.utils.JsonParser; import com.google.gson.JsonElement; public class QQNewsHttpRequest { public static void getQQNewsDate(final int page){ String url = Constants.getQQNewsUrl(page); StringRequest request = new StringRequest(url, new Listener<String>() { @Override public void onResponse(String response) { if (page ==1 ) QQNewsHttpManager.getQQNewsByPageFirst(response); else QQNewsHttpManager.getQQNewsByPage(response); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { QQNewsHttpManager.getQQNewsByPageError(); } }) /* { @Override protected Response<String> parseNetworkResponse( NetworkResponse response) { String str = null; try { str = new String(response.data,"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return Response.success(str, HttpHeaderParser.parseCacheHeaders(response)); } }*/ ; Volley.newRequestQueue(MyApplication.newInstance()).add(request); } }
package com.curiousby.fitnessandappointment.activity; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import com.curiousby.fitnessandappointment.MyApplication; import com.curiousby.fitnessandappointment.R; import com.curiousby.fitnessandappointment.adpter.QQNewsAdapter; import com.curiousby.fitnessandappointment.constants.Constants; import com.curiousby.fitnessandappointment.entity.QQNewsItemEntity; import com.curiousby.fitnessandappointment.quote.xlistview.MsgListView; import com.curiousby.fitnessandappointment.quote.xlistview.MsgListView.IXListViewListener; import com.curiousby.fitnessandappointment.request.event.QQNewsStringHttpEvent; import com.curiousby.fitnessandappointment.request.event.base.RequestEvent; import com.curiousby.fitnessandappointment.request.http.QQNewsHttpRequest; import com.curiousby.fitnessandappointment.utils.QQNewsMatcherPerformer; import de.greenrobot.event.EventBus; public class QQNewsActivity extends BaseActivity implements IXListViewListener ,OnItemClickListener{ private MsgListView mListView; private List<QQNewsItemEntity> mDataList; private QQNewsAdapter mAdapter; private static int start = 1; private Context mContext; public final static String QQ_NEWS_DETAIL_URL = "qq_news_detail_url"; @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.qqnews_list); this.mContext = QQNewsActivity.this; initUtils(); initView( ); initListeners(); EventBus.getDefault().register( this ); start =1; QQNewsHttpRequest.getQQNewsDate(start); } private void initUtils() { mDataList = new ArrayList<QQNewsItemEntity>(); mAdapter = new QQNewsAdapter(mContext); mAdapter.setmDataList(mDataList); } private void initView() { mListView = (MsgListView) this.findViewById(R.id.qq_news_list); mListView.setAdapter(mAdapter); } private void initListeners() { mListView.setPullLoadEnable(true); mListView.setPullRefreshEnable(true); mListView.setXListViewListener(this); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener( this ); } @Override public void onRefresh() { start =1; mListView.setPullLoadEnable(true); mListView.setPullRefreshEnable(true); QQNewsHttpRequest.getQQNewsDate(start); } @Override public void onLoadMore() { start += 1; QQNewsHttpRequest.getQQNewsDate(start); } @Override public void onDestroy() { EventBus.getDefault().unregister( this ); super.onDestroy(); } public void onEventMainThread(RequestEvent requestEvent){ if(requestEvent instanceof QQNewsStringHttpEvent){ QQNewsStringHttpEvent event = (QQNewsStringHttpEvent) requestEvent; switch(event.status){ case HTTP_ERROR: mListView.stopRefresh(); mListView.stopLoadMore(); mListView.setPullLoadEnable(false); break; case HTTP_START: { mListView.stopRefresh(); mListView.stopLoadMore(); String result = event.data; mAdapter.clearMDataList(); List<QQNewsItemEntity> list = QQNewsMatcherPerformer.parseHtmlData(result); mAdapter.setmDataList(list); mAdapter.notifyDataSetChanged(); } break; case HTTP_SUCCESS: { mListView.stopRefresh(); mListView.stopLoadMore(); String result = event.data; List<QQNewsItemEntity> list = QQNewsMatcherPerformer.parseHtmlData(result); mAdapter.addMDataList(list); mAdapter.notifyDataSetChanged(); } break; default: break; } } } @Override public void onItemClick( AdapterView<?> parent, View view, int position, long id) { QQNewsItemEntity item = mAdapter.getItem(position - 1 ); if (item != null) { Intent msgIntent = new Intent(); Log.e("baoyou", Constants.url_qq_news_base + item.getNewsDetailUrl()); Bundle bundle = new Bundle(); // Bundle的底层是一个HashMap<String, Object bundle.putString(QQNewsActivity.QQ_NEWS_DETAIL_URL, item.getNewsDetailUrl() ); msgIntent.putExtra("bundle", bundle); msgIntent.setClass(MyApplication.newInstance(), QQNewsDetailActivity.class); startActivityForResult( msgIntent, 1000 ); } } }
package com.curiousby.fitnessandappointment.activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.webkit.WebSettings; import android.webkit.WebSettings.LayoutAlgorithm; import android.webkit.WebView; import android.webkit.WebViewClient; import com.curiousby.fitnessandappointment.R; import com.curiousby.fitnessandappointment.constants.Constants; public class QQNewsDetailActivity extends BaseActivity { private WebView webView; private String url ="https://www.baidu.com"; @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.qqnews_list_item_detail); initUtils(); initView( ); initListeners(); } private void initListeners() { webView.loadUrl(url); showWaitingDialog(""); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); dismissWaitingDialog(); return true; } }); } private void initView() { webView = (WebView) this.findViewById(R.id.wv_qq_news_item_detail_webview); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); //支持js //settings.setPluginsEnabled(true); //支持插件 settings.setUseWideViewPort(false); //将图片调整到适合webview的大小 settings.setSupportZoom(true); //支持缩放 settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); } private void initUtils() { Intent intent = getIntent(); Bundle bundle = intent.getBundleExtra("bundle"); String path =bundle.getString(QQNewsActivity.QQ_NEWS_DETAIL_URL); url = Constants.url_qq_news_base + path; } }
package com.curiousby.fitnessandappointment.adpter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.curiousby.fitnessandappointment.R; import com.curiousby.fitnessandappointment.entity.QQNewsItemEntity; import com.curiousby.fitnessandappointment.quote.volley.ImageCacheManager; public class QQNewsAdapter extends BaseAdapter{ private LayoutInflater mInflater; private List<QQNewsItemEntity> mDataList; private Context mContext; public QQNewsAdapter(Context mContext) { this.mContext = mContext; this.mInflater = LayoutInflater.from(mContext); } public List<QQNewsItemEntity> getmDataList() { return mDataList; } public void setmDataList(List<QQNewsItemEntity> mDataList) { if (this.mDataList == null ) { this.mDataList = new ArrayList<QQNewsItemEntity>(); } this.mDataList = mDataList; } public void addMDataList(List<QQNewsItemEntity> mDataList) { this.mDataList.addAll(mDataList); } public void clearMDataList( ) { this.mDataList.clear(); } @Override public int getCount() { if (mDataList != null && mDataList.size() > 0) return mDataList.size(); return 0; } @Override public QQNewsItemEntity getItem(int position) { if (mDataList != null && mDataList.size() > 0) return mDataList.get(position); return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if ( convertView == null || convertView.getTag() ==null ) { convertView = mInflater.inflate( R.layout.qqnews_list_item,parent, false); viewHolder = new ViewHolder(convertView); convertView.setTag( viewHolder ); }else{ viewHolder = ( ViewHolder ) convertView.getTag(); } QQNewsItemEntity qqnie = getItem(position); if (qqnie != null) { ImageCacheManager.loadImage(qqnie.getUrlImgAddress(),viewHolder.qqnewspic, getBitmapFromRes(R.drawable.ic_launcher), getBitmapFromRes(R.drawable.ic_launcher)); viewHolder.qqnewstitle.setText(qqnie.getNewsTitle()); viewHolder.qqnewscontent.setText(qqnie.getNewsSummary()); } return convertView; } class ViewHolder{ public ImageView qqnewspic; public TextView qqnewstitle; public TextView qqnewscontent; public ViewHolder(View baseView) { this.qqnewspic = (ImageView) baseView.findViewById(R.id.qq_news_image_link); this.qqnewstitle = (TextView) baseView.findViewById(R.id.qq_news_txt_title); this.qqnewscontent = (TextView) baseView.findViewById(R.id.qq_news_txt_summary); } } public Bitmap getBitmapFromRes(int resId) { Resources res = mContext.getResources(); return BitmapFactory.decodeResource(res, resId); } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="1dp"> <ImageView android:id="@+id/qq_news_image_link" android:layout_width="80dp" android:layout_height="wrap_content" android:scaleType="centerCrop" android:layout_centerVertical="true" android:layout_above="@+id/v_qq_news_line" android:background="@drawable/ic_launcher" /> <LinearLayout android:layout_marginLeft="10dp" android:id="@+id/ll_qq_news_contentandhead" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/qq_news_image_link" android:orientation="vertical"> <TextView android:id="@+id/qq_news_txt_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="标题" android:textSize="16dp" /> <TextView android:layout_marginTop="5dp" android:id="@+id/qq_news_txt_summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="内容" android:layout_marginBottom="3dp" android:textSize="12dp" /> </LinearLayout> <View android:id="@+id/v_qq_news_line" android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginBottom="3dp" android:layout_marginTop="5dp" android:background="@color/grey" android:layout_alignParentBottom="true"/> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RelativeLayout android:id="@+id/rl_qq_news_head" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/title_bar" android:gravity="center_vertical" android:orientation="horizontal" android:padding="3dp" android:layout_alignParentTop="true" > <TextView android:id="@+id/tv_qq_news_head_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="新闻" android:textColor="#FFF" android:textSize="20sp" android:textStyle="bold" /> </RelativeLayout> <com.curiousby.fitnessandappointment.quote.xlistview.MsgListView android:id="@+id/qq_news_list" android:layout_below="@id/rl_qq_news_head" android:background="@color/white" android:layout_width="match_parent" android:layout_height="fill_parent" android:divider="@null"> </com.curiousby.fitnessandappointment.quote.xlistview.MsgListView> </RelativeLayout>
package com.curiousby.fitnessandappointment.constants; import java.util.ArrayList; import java.util.List; import com.curiousby.fitnessandappointment.R; import com.curiousby.fitnessandappointment.entity.GridEntity; public class Constants { public final static String BASEIP ="http://127.0.0.1:8080"; public final static String login_url = BASEIP + "/RepositoryPic/WebService/rest/user/login"; public final static String friendship_url = BASEIP + "/RepositoryPic/WebService/rest/friendShip/friendShips/"; public final static String url_addDeviceToTag = BASEIP + "/RepositoryPic/WebService/rest/pushService/addDevicesToTag"; public final static String url_post_sendMessageToTag =BASEIP + "/RepositoryPic/WebService/rest/pushService/sendMessageToTag"; public final static String url_feed =BASEIP + "/RepositoryPic/WebService/rest/feedAll/feedAlls/user"; public final static String url_add_feed_comment =BASEIP + "/RepositoryPic/WebService/rest/feedAll/feedCommemtAdd"; public final static String url_add_feed_zan =BASEIP + "/RepositoryPic/WebService/rest/feedAll/feedZanAdd"; public final static String url_feed_create = BASEIP + "/RepositoryPic/WebService/rest/feedAll/createFeed"; public final static String url_qq_news_base="http://news.qq.com"; public static String url_qq_news_guonei = url_qq_news_base +"/c/816guonei_?.htm"; public static String getQQNewsUrl (int page){ return url_qq_news_guonei.replace("?", page+""); } public static List<GridEntity> getGridItem() { List<GridEntity> list = new ArrayList<GridEntity>(); list.add(new GridEntity(1, "动态", R.drawable.mian_trend_grid_trend, 1)); list.add(new GridEntity(2, "悦动圈", R.drawable.mian_trend_grid_yuedongquan, 2)); list.add(new GridEntity(3, "新闻", R.drawable.qq_ketang, 3)); return list; } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!