安卓課程設(shè)計-新聞客戶端(基于網(wǎng)頁抓取)_第1頁
安卓課程設(shè)計-新聞客戶端(基于網(wǎng)頁抓取)_第2頁
安卓課程設(shè)計-新聞客戶端(基于網(wǎng)頁抓取)_第3頁
安卓課程設(shè)計-新聞客戶端(基于網(wǎng)頁抓取)_第4頁
安卓課程設(shè)計-新聞客戶端(基于網(wǎng)頁抓取)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

題目android課程設(shè)計——新聞客戶端姓名:學(xué)號:專業(yè):學(xué)院:指導(dǎo)教師:二零一八年十一月一、需求分析啟動程序后可以進行新聞資訊的實時更新,可分不同的欄目讓使用者了解任意感興趣的資訊進行閱讀,啟動程序后可以進行新聞資訊的實時更新,可分不同的欄目讓使用者了解任意感興趣的資訊進行閱讀。1)啟動應(yīng)用程序;2)設(shè)置界面:采用多種布局嵌套,美化控件。3)顯示界面:模仿網(wǎng)易新聞客戶端進行UI編寫。4)詳細界面:分為頭條、國內(nèi)、國際、財經(jīng)、科技、社會等板塊從用戶的角度出發(fā),針對用戶的需求,所涉及的程序響應(yīng)速度快、信息處理速度快、平安性高是用戶所需要的三大主要性能,另外為了受眾面更廣,根據(jù)目前的android設(shè)備系統(tǒng)版本的分布情況,android2.3以上的版本占到設(shè)備總量的80%以上,所以做開發(fā)的時候選擇的android系統(tǒng)最低版本也必須是android2.3以上來保證用戶量。二、概要設(shè)計〔一〕開發(fā)環(huán)境采用windows+Eclipse+ADT的環(huán)境進行開發(fā),在Android2.3以上版本的系統(tǒng)中運行的?!捕诚到y(tǒng)流程軟件分為了兩大模塊,分別是新聞客戶端模塊和效勞器模塊。a〕客戶端顧名思義就是前臺框架設(shè)計,模仿了網(wǎng)易新聞的app,界面設(shè)計參考的是github網(wǎng)站的前輩;備注:翻開后界面默認為“頭條〞界面b〕效勞器這里值得一提的是做成了抓取各新聞網(wǎng)站,解析出新聞呈現(xiàn)給前臺,用的是jsoup.jar獲取和htmlparser.jar解析,有點復(fù)雜了,但還好有使用方法,能直接拿過來用。1.jsoup.jar獲取〔參考:〕將下載下來的jar包放到放到Android工程中l(wèi)ibs目錄下,加以編寫即可:Stringhtml="<html><head><title>Firstparse</title></head>"+"<body><p>ParsedHTMLintoadoc.</p></body></html>";Documentdoc=Jsoup.parse(html);上面這個例子比擬簡單,直接就將html轉(zhuǎn)換成Document實例了,之后再解析2.htmlparser.jar解析〔參考:〕網(wǎng)頁解析模塊要實現(xiàn)兩大功能:1.從頁面中提取出子鏈接,參加到爬取url隊列中;2.解析網(wǎng)頁內(nèi)容,與主題進行相關(guān)度計算。具體步驟如下:a.讀取html文件,獲得頁面編碼,獲得String格式的文件內(nèi)容b.用頁面編碼實例化html文件的Parserc.對需要提取的結(jié)點設(shè)置相應(yīng)的Filterd.根據(jù)給定的Filter,用Parser解析html文件e.提取結(jié)點中的文本內(nèi)容,進行處理三、設(shè)計與實現(xiàn)〔一〕布局設(shè)計主要設(shè)計了三個界面:全局界面、新聞列表顯示界面、詳細新聞界面a.全局界面〔main.xml〕<?xmlversion="1.0"encoding="utf-8"?>android"xmlns:tools="://schemas.android/tools"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/bg_title_bar"android:orientation="vertical"tools:context=".Main"><LinearLayoutandroid:id="@+id/title_layout"android:layout_width="fill_parent"android:layout_height="20dp"android:background="@drawable/public_titlebar_bg"android:orientation="horizontal"><TextViewandroid:id="@+id/textView_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="@string/app_name"android:textColor="#000"android:textSize="12sp"/></LinearLayout><LinearLayoutandroid:id="@+id/main_type_title"android:layout_width="wrap_content"android:layout_height="50dip"android:layout_gravity="center_vertical"android:orientation="horizontal"><HorizontalScrollViewandroid:id="@+id/main_scroll"android:layout_width="0dip"android:layout_height="50dip"android:layout_weight="1"android:scrollbars="none"><LinearLayoutandroid:id="@+id/main_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:orientation="horizontal"></LinearLayout></HorizontalScrollView><Buttonandroid:id="@+id/main_speak"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dip"android:layout_marginRight="10dip"android:background="@drawable/bg_read_button_select"android:gravity="right|center_vertical"android:paddingRight="10dip"android:text="@string/button_text_read"android:textColor="#FFFFFFFF"/></LinearLayout>android:id="@+id/main_page"android:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="1"android:background="#FF000000"/></LinearLayout>b.新聞列表顯示界面(list_item.xml)ListView是Android系統(tǒng)自帶的控件之一,它的使用同樣是十分廣泛的,它通常用來加載一系列相同布局的列表。使用它同樣需要一個PagerAdapter適配器來給它提供數(shù)據(jù)。從新聞列表的特征來看,顯然是由一個ListView來實現(xiàn)的。但是為了在滑動ListView的時候,帶動ViewPager一起滑動,那么需要自定義一個控件,來講廣告輪播條的ViewPager和新聞列表的ListView關(guān)聯(lián)起來。而大局部的新聞軟件都有上拉刷新和下拉加載更多的功能,所以在此自定義控件中也應(yīng)加上上拉刷新和下拉加載更多的功能。此自定義控件繼承了ListView類,實現(xiàn)了OnScrollListener,android.widget.AdapterView.OnItemClickListener接口。c.詳細新聞界面(detail.xml)新聞詳情頁即是點擊新聞進入后的頁面,使用一個ScrollView來實現(xiàn)。在新聞詳情頁中,用戶可以點擊返回按鈕返回到前一頁面?!捕彻δ軐崿F(xiàn)a.主新聞頁面的設(shè)計與實現(xiàn)定義出頁面所需要用到的控件以及新聞欄目的適配器〔如右圖〕,然后初始化界面布局、標題等:protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); initLayout(); initViewPage(); initTitle(); }b.新聞詳細頁面的設(shè)計與實現(xiàn):c.數(shù)據(jù)接口:publicclassDataAdapterextendsBaseAdapter{ ContextmContext=null; LayoutInflaterinflater; List<NewsBrief>newsData=newArrayList<NewsBrief>(); publicDataAdapter(Contextcontext,List<NewsBrief>nList){ mContext=context; inflater=LayoutInflater.from(context); newsData=nList; } @Override publicintgetCount(){ returnnewsData.size(); } @Override publicObjectgetItem(intarg0){ returnnull; } @Override publiclonggetItemId(intposition){ return0; } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ HolderViewhView=null; if(null==convertView){ hView=newHolderView(); convertView=inflater.inflate(R.layout.list_item,null); hView.image=(ImageView)convertView.findViewById(R.id.news_image); hView.speak=(ImageView)convertView.findViewById(R.id.news_speak); hView.title=(TextView)convertView.findViewById(R.id.news_title); hView.brief=(TextView)convertView.findViewById(R.id.news_brief); hView.where=(TextView)convertView.findViewById(R.id.news_where); hView.date=(TextView)convertView.findViewById(R.id.news_time); convertView.setTag(hView); }else{ hView=(HolderView)convertView.getTag(); } hView.title.setText(newsData.get(position).getTitle()); if(!"".equals(newsData.get(position).getContent())&&newsData.get(position).getContent().length()>26){ Stringstr=newsData.get(position).getContent().trim().substring(0,24); hView.brief.setText(NetUtil2.replaceBlank(str)); }else{ hView.brief.setText(""); } if(NetUtil2.CURRENT_SPEAK.equals(newsData.get(position).getUrl())){ hView.speak.setVisibility(View.VISIBLE); hView.title.setTextColor(Color.RED); }else{ hView.speak.setVisibility(View.GONE); hView.title.setTextColor(Color.WHITE); } hView.where.setText(newsData.get(position).getSource()); hView.date.setText(newsData.get(position).getPubDate()); if(null!=newsData.get(position).getImgUrl() &&!"".equals(newsData.get(position).getImgUrl())){ hView.image.setTag(newsData.get(position).getImgUrl()); ImageLoader2.getInstance(mContext).loadImage(newsData.get(position).getImgUrl(),hView.image); }else{ hView.image.setImageResource(R.drawable.icon_image_default); } returnconvertView; } publicclassHolderView{ privateImageViewimage=null; privateImageViewspeak=null; privateTextViewtitle=null; privateTextViewbrief=null; privateTextViewwhere=null; privateTextViewdate=null; }}d.數(shù)據(jù)獲?。豪胘soup和htmlparser抓緊并解析新聞,下面為解析騰訊新聞頁面:publicclassNetUtil{publicstaticList<NewsBrief>DATALIST=newArrayList<NewsBrief>();publicstaticString[][]CHANNEL_URL=newString[][]{newString[]{"://news.qq/world_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/society_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},newString[]{"://news.qq/china_index.shtml","://news.qq"},};publicstaticintgetTechNews(List<NewsBrief>techData,intcId){intresult=0;try{NodeFilterfilter=newAndFilter(newTagNameFilter("div"),newHasAttributeFilter("id","listZone"));Parserparser=newParser();parser.setURL(CHANNEL_URL[cId][0]);parser.setEncoding(parser.getEncoding());NodeListlist=parser.extractAllNodesThatMatch(filter);for(inti=0;i<list.size();i++){Tagnode=(Tag)list.elementAt(i);for(intj=0;j<node.getChildren().size();j++){try{Stringtextstr=node.getChildren().elementAt(j).toHtml();if(textstr.trim().length()>0){NodeFiltersubFilter=newTagNameFilter("p");ParsersubParser=newParser();subParser.setResource(textstr);NodeListsubList=subParser.extractAllNodesThatMatch(subFilter);NodeFiltertitleStrFilter=newAndFilter(newTagNameFilter("a"),newHasAttributeFilter("class","linkto"));ParsertitleStrParser=newParser();titleStrParser.setResource(textstr);NodeListtitleStrList=titleStrParser.extractAllNodesThatMatch(titleStrFilter);intlinkstart=titleStrList.toHtml().indexOf("href=\"");intlinkend=titleStrList.toHtml().indexOf("\">");inttitleend=titleStrList.toHtml().indexOf("</a>");Stringlink=CHANNEL_URL[cId][1]+titleStrList.toHtml().substring(linkstart+6,linkend);Stringtitle=titleStrList.toHtml().substring(linkend+2,titleend);NewsBriefnewsBrief=newNewsBrief();newsBrief.setTitle(title);newsBrief.setUrl(link);newsBrief.setSummary(subList.asString());techData.add(newsBrief);}}catch(Exceptione){e.printStackTrace();}}}}catch(Exceptione){result=1;e.printStackTrace();}returnresult;}publicstaticintgetTechNews2(List<NewsBrief>techData,intcId){intresult=0;try{//查詢://tech.qq/tech_yejie.htm頁面滾動新聞的標簽以及IDNodeFilterfilter=newAndFilter(newTagNameFilter("div"),newHasAttributeFilter("id","listZone"));Parserparser=newParser();parser.setURL(CHANNEL_URL[cId][0]);parser.setEncoding(parser.getEncoding());//獲取匹配的fileter的節(jié)點NodeListlist=parser.extractAllNodesThatMatch(filter);StringBuilderNewsStr=newStringBuilder("<table>");//新聞表格字符串for(inti=0;i<list.size();i++){Tagnode=(Tag)list.elementAt(i);for(intj=0;j<node.getChildren().size();j++){Stringtextstr=node.getChildren().elementAt(j).toHtml().trim();if(textstr.length()>0){intlinkbegin=0,linkend=0,titlebegin=0,titleend=0;while(true){linkbegin=textstr.indexOf("href=",titleend);//截取鏈接字符串起始位置//如果不存在href了也就結(jié)束了if(linkbegin<0)break;linkend=textstr.indexOf("\">",linkbegin);//截取鏈接字符串結(jié)束位置Stringsublink=textstr.substring(linkbegin+6,linkend);Stringlink=CHANNEL_URL[cId][1]+sublink;titlebegin=textstr.indexOf("\">",linkend);titleend=textstr.indexOf("</a>",titlebegin);Stringtitle=textstr.substring(titlebegin+2,titleend);NewsStr.append("\r\n<tr>\r\n\t<td><atarget=\"_blank\"href=\""+link+"\">");NewsStr.append(title);NewsStr.append("</a></td></tr>");NewsBriefnewsBrief=newNewsBrief();newsBrief.setTitle(title);newsBrief.setUrl(link);techData.add(newsBrief);}}}}}catch(Exceptione){result=1;e.printStackTrace();}returnresult;}publicstaticintparserURL(Stringurl,NewsBriefnewsBrief){intresult=0;try{Parserparser=newParser(url);NodeFiltercontentFilter=newAndFilter(newTagNameFilter("div"),newHasAttributeFilter("id","Cnt-Main-Article-QQ"));NodeFilternewsdateFilter=newAndFilter(newTagNameFilter("span"),newHasAttributeFilter("class","article-time"));NodeFilternewsauthorFilter=newAndFilter(newTagNameFilter("span"),newHasAttributeFilter("class","color-a-1"));NodeFilterimgUrlFilter=newTagNameFilter("IMG");newsBrief.setContent(parserContent(contentFilter,parser));parser.reset();//記得每次用完parser后,要重置一次parser。要不然就得不到我們想要的內(nèi)容了。newsBrief.setPubDate(parserDate(newsdateFilter,parser));parser.reset();newsBrief.setSource(parserAuthor(newsauthorFilter,parser));parser.reset();newsBrief.setImgUrl(parserImgUrl(contentFilter,imgUrlFilter,parser));}catch(Exceptione){result=1;e.printStackTrace();}returnresult;}privatestaticStringparserContent(NodeFilterfilter,Parserparser){Stringreslut="";try{NodeListcontentList=(NodeList)parser.parse(filter);//將DIV中的標簽都去掉只留正文reslut=contentList.asString();}catch(Exceptione){e.printStackTrace();}returnreslut;}privatestaticStringparserDate(NodeFilterfilter,Parserparser){Stringreslut="";try{NodeListdatetList=(NodeList)parser.parse(filter);//將DIV中的標簽都去掉只留正文reslut=datetList.asString();}catch(Exceptione){e.printStackTrace();}returnreslut;}privatestaticStringparserAuthor(NodeFilterfilter,Parserparser){Stringreslut="";try{NodeListauthorList=(NodeList)parser.parse(filter);//將DIV中的標簽都去掉只留正文reslut=authorList.asString();}catch(Exceptione){e.printStackTrace();}returnreslut;}privatestaticList<String>parserImgUrl(NodeFilterbodyfilter,NodeFilterfilter,Parserparser){List<String>reslut=newArrayList<String>();try{NodeListbodyList=(NodeList)parser.parse(bodyf

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論