1、题 目 android 课程设计新闻客户端 姓 名: 学 号: 专 业: 学 院: 指导教师: 二 零 一 八 年 十 一 月一、需求分析启动程序后可以进行新闻资讯的实时更新,可分不同的栏目让使用者了解任意感兴趣的资讯进行阅读,启动程序后可以进行新闻资讯的实时更新,可分不同的栏目让使用者了解任意感兴趣的资讯进行阅读。1)启动应用程序; 2)设置界面:采用多种布局嵌套,美化控件。 3)显示界面:模仿网易新闻客户端进行 UI 编写。 4)详细界面:分为头条、国内、国际、财经、科技、社会等板块从用户的角度出发,针对用户的需求,所涉及的程序响应速度快、信息处理速度快、安全性高是用户所需要的三大主要性能
2、,另外为了受众面更广,根据目前的 android 设备系统版本的分布情况,android2.3 以上的版本占到设备总量的 80%以上,所以做开发的时候选择的 android 系统最低版本也必须是android2.3 以上来保证用户量。二、概要设计(一)开发环境采用 windows+Eclipse+ADT 的环境进行开发,在 Android2.3 以上版本的系统中运行的。(二)系统流程软件分为了两大模块,分别是新闻客户端模块和服务器模块。a)客户端顾名思义就是前台框架设计,模仿了网易新闻的 app,界面设计参考的是github 网站的前辈;备注:打开后界面默认为“头条”界面b)服务器这里值得一提
3、的是做成了抓取各新闻网站,解析出新闻呈现给前台,用的是jsoup.jar 获取和 htmlparser.jar 解析,有点复杂了,但还好有使用方法,能直接拿过来用。1. jsoup.jar 获取(参考:http:/www.open- jar 包放到放到 Android 工程中 libs 目录下,加以编写即可:String html = “First parse“ + “Parsed HTML into a doc.“; Document doc = Jsoup.parse(html); 上面这个例子比较简单,直接就将 html 转换成 Document 实例了,之后再解析2. htmlpars
4、er.jar 解析(参考:http:/ url 队列中;2.解析网页内容,与主题进行相关度计算。具体步骤如下:a.读取 html 文件,获得页面编码,获得 String 格式的文件内容b.用页面编码实例化 html 文件的 Parserc.对需要提取的结点设置相应的 Filterd.根据给定的 Filter,用 Parser 解析 html 文件e.提取结点中的文本内容,进行处理三、设计与实现(一)布局设计主要设计了三个界面:全局界面、新闻列表显示界面、详细新闻界面a. 全局界面(main.xml)b. 新闻列表显示界面(list_item.xml)ListView 是 Android 系统自
5、带的控件之一,它的使用同样是十分广泛的,它通常用来加载一系列相同布局的列表。使用它同样需要一个 PagerAdapter 适配器来给它提供数据。从新闻列表的特征来看,显然是由一个 ListView 来实现的。但是为了在滑动 ListView 的时候,带动 ViewPager 一起滑动,则需要自定义一个控件,来讲广告轮播条的 ViewPager 和新闻列表的 ListView 关联起来。而大部分的新闻软件都有上拉刷新和下拉加载更多的功能,所以在此自定义控件中也应加上上拉刷新和下拉加载更多的功能。此自定义控件继承了 ListView类,实现了OnScrollListener,android.wid
6、get.AdapterView.OnItemClickListener 接口。c. 详细新闻界面(detail.xml)新闻详情页即是点击新闻进入后的页面,使用一个 ScrollView 来实现。在新闻详情页中,用户可以点击返回按钮返回到前一页面。(二)功能实现a. 主新闻页面的设计与实现定义出页面所需要用到的控件以及新闻栏目的适配器(如右图) ,然后初始化界面布局、标题等:protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);requestWindowFeature(Wind
7、ow.FEATURE_NO_TITLE);setContentView(R.layout.main);initLayout();initViewPage();initTitle();b. 新闻详细页面的设计与实现:c.数据接口:public class DataAdapter extends BaseAdapter Context mContext = null;LayoutInflater inflater;List newsData = new ArrayList();public DataAdapter(Context context, List nList) mContext = co
8、ntext;inflater = LayoutInflater.from(context);newsData = nList;Overridepublic int getCount() return newsData.size();Overridepublic Object getItem(int arg0) return null;Overridepublic long getItemId(int position) return 0;Overridepublic View getView(int position, View convertView, ViewGroup parent) H
9、olderView hView = null;if (null = convertView) hView = new HolderView();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.f
10、indViewById(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();h
11、View.title.setText(newsData.get(position).getTitle();if(!“.equals(newsData.get(position).getContent() 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.setT
12、extColor(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()ImageLoader2.getInstance(mContext).loadImag
13、e(newsData.get(position).getImgUrl(), hView.image); else hView.image.setImageResource(R.drawable.icon_image_default);return convertView;public class HolderView private ImageView image = null;private ImageView speak = null;private TextView title = null;private TextView brief = null;private TextView w
14、here = null;private TextView date = null;d. 数据获取:利用 jsoup 和 htmlparser 抓紧并解析新闻,下面为解析腾讯新闻页面:public class NetUtil public static List DATALIST = new ArrayList(); public static String CHANNEL_URL = new String new String“http:/ new String“http:/ new String“http:/ new String“http:/ new String“http:/ new S
15、tring“http:/ new String“http:/ new String“http:/ new String“http:/ new String“http:/ new String“http:/ ; public static int getTechNews(List techData, int cId) int result = 0; try NodeFilter filter = new AndFilter(new TagNameFilter(“div“), new HasAttributeFilter(“id“, “listZone“); Parser parser = new
16、 Parser(); parser.setURL(CHANNEL_URLcId0); parser.setEncoding(parser.getEncoding(); NodeList list = parser.extractAllNodesThatMatch(filter); for (int i = 0; i 0) NodeFilter subFilter = new TagNameFilter(“p“); Parser subParser = new Parser(); subParser.setResource(textstr); NodeList subList = subPars
17、er.extractAllNodesThatMatch(subFilter); NodeFilter titleStrFilter = new AndFilter(new TagNameFilter(“a“), new HasAttributeFilter(“class“, “linkto“); Parser titleStrParser = new Parser(); titleStrParser.setResource(textstr); NodeList titleStrList = titleStrParser.extractAllNodesThatMatch(titleStrFilt
18、er); int linkstart = titleStrList.toHtml().indexOf(“href=“); int linkend = titleStrList.toHtml().indexOf(“); int titleend = titleStrList.toHtml().indexOf(“); String link = CHANNEL_URLcId1+titleStrList.toHtml().substring(linkstart+6, linkend); String title = titleStrList.toHtml().substring(linkend+2,
19、 titleend); NewsBrief newsBrief = new NewsBrief(); newsBrief.setTitle(title); newsBrief.setUrl(link); newsBrief.setSummary(subList.asString(); techData.add(newsBrief); catch (Exception e) e.printStackTrace(); catch (Exception e) result = 1; e.printStackTrace(); return result; public static int getTe
20、chNews2(List techData, int cId) int result = 0; try / 查询http:/ 页面 滚动新闻的 标签 以及 ID NodeFilter filter = new AndFilter(new TagNameFilter(“div“), new HasAttributeFilter(“id“, “listZone“); Parser parser = new Parser(); parser.setURL(CHANNEL_URLcId0); parser.setEncoding(parser.getEncoding(); / 获取匹配的 filete
21、r的节点 NodeList list = parser.extractAllNodesThatMatch(filter); StringBuilder NewsStr = new StringBuilder(“);/ 新闻表格字符串 for (int i = 0; i 0) int linkbegin = 0, linkend = 0, titlebegin = 0, titleend = 0; while (true) linkbegin = textstr.indexOf(“href=“, titleend);/ 截取链接字符串起始位置 / 如果不存在 href了 也就结束了 if (li
22、nkbegin “, linkbegin);/ 截取链接字符串结束位置 String sublink = textstr.substring(linkbegin + 6,linkend); String link = CHANNEL_URLcId1 + sublink; titlebegin = textstr.indexOf(“, linkend); titleend = textstr.indexOf(“, titlebegin); String title = textstr.substring(titlebegin + 2,titleend); NewsStr.append(“rnrn
23、t“); NewsStr.append(title); NewsStr.append(“); NewsBrief newsBrief = new NewsBrief(); newsBrief.setTitle(title); newsBrief.setUrl(link); techData.add(newsBrief); catch (Exception e) result = 1; e.printStackTrace(); return result; public static int parserURL(String url,NewsBrief newsBrief) int result
24、 = 0; try Parser parser = new Parser(url); NodeFilter contentFilter = new AndFilter( new TagNameFilter(“div“), new HasAttributeFilter(“id“,“Cnt-Main-Article-QQ“); NodeFilter newsdateFilter = new AndFilter( new TagNameFilter(“span“), new HasAttributeFilter(“class“, “article-time“); NodeFilter newsaut
25、horFilter = new AndFilter( new TagNameFilter(“span“), new HasAttributeFilter(“class“, “color-a-1“); NodeFilter imgUrlFilter = new TagNameFilter(“IMG“); newsBrief.setContent(parserContent(contentFilter,parser); parser.reset(); / 记得每次用完parser后,要重置一次 parser。要不然就得不到我们想要的内容了。 newsBrief.setPubDate(parserD
26、ate(newsdateFilter,parser); parser.reset(); newsBrief.setSource(parserAuthor(newsauthorFilter, parser); parser.reset(); newsBrief.setImgUrl(parserImgUrl(contentFilter,imgUrlFilter, parser); catch (Exception e) result=1; e.printStackTrace(); return result; private static String parserContent(NodeFilt
27、er filter, Parser parser) String reslut = “; try NodeList contentList = (NodeList) parser.parse(filter); / 将 DIV中的标签都 去掉只留正文 reslut = contentList.asString(); catch (Exception e) e.printStackTrace(); return reslut; private static String parserDate(NodeFilter filter, Parser parser) String reslut = “;
28、try NodeList datetList = (NodeList) parser.parse(filter); / 将 DIV中的标签都 去掉只留正文 reslut = datetList.asString(); catch (Exception e) e.printStackTrace(); return reslut; private static String parserAuthor(NodeFilter filter, Parser parser) String reslut = “; try NodeList authorList = (NodeList) parser.parse(filter); / 将 DIV中的标签都 去掉只留正文 reslut = authorList.asString();
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。