这篇博文前天就想写了,最近发生了很多事,而且我确实心里比较浮躁,没在状态上,因此就一直拖着.今天上午起来看看时间,都快中秋了.哎,想想时间过的还真是快.自己先前计划的在8月底的时候做出来几个小东西,到现在才做出来一个,惭愧啊.算了,不多说了.一边写博文,一边等待聘用通知吧.
做android下的Rss阅读器,其实最核心的功能,并不是多难.先前我在博文上就已经贴出来rss核心解析的代码.
一.先说说我做这个android rss阅读器的思路吧.
1.界面部分:
    在顶部是一个spinner,在这个地方可以选择rss的源.底下紧跟着的是一个listview,用来显示rss源中读取出来的新闻标题.
2.相关功能:
    1.要能手动更新rss新闻.更新rss新闻时,会根据spinner处选择的rss源的不同来更新出不同的结果.
    2.点击列表中的一条新闻,能打开对应的网页以方便使用者能查看具体的新闻
3.功能菜单
    1.一个退出菜单,用来退出整个应用程序,这个是必须的
    2.一个更新新闻菜单,用来加载最新rss新闻
    3.一个关于菜单,用来挂广告的(呃,现在我还没考虑赚钱,先挂一个自我介绍的广告得了)
二.实现过程
1.rss解析
    rss解析部分先前就已经实现了.只不过当时是做的一个java版本的没有界面的一个rss解析器,还不能称为阅读器
2.界面实现
    在主界面的布局文件上:
    定义了一个spinner和listview元素

>
>
/>
/>
>
/>
>
>


    同时在另外一个布局文件中定义了listview中的每行的元素的格式布局

>
 
 
/>


3.菜单布置
    菜单实现上,专门在res下建立了menu文件夹,在其下创建menu.xml,里面定义了三个菜单元素,分别对应着更新rss新闻,关于和退出

>
>
>
>
>
>

4.前后端交互部分实现

package com.leipei.android;
   2:  
import java.util.ArrayList;
import java.util.List;
   5:  
import com.leipei.rss.Message;
import com.leipei.rss.RssSaxParser;
   8:  
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;
  27:  
extends ListActivity {
  29:  
private Spinner rssSelectSpinner;
private String[] rssurlarray;
private String currentRssurl;
private List<Message> messages;
  34:  
/** Called when the activity is first created. */
  36:     @Override
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
  39:         setContentView(R.layout.main);
  40:         rssSelectSpinner = (Spinner) findViewById(R.id.rssSourceSpinner);
  41:         loadSpinner();
  42:         initRssUrlArray();
  43:     }
  44:  
/*
     * 初始化Rss数据源的url数组 从先前定义好的rss源的xml文件中获取rss源的名称
     */
void initRssUrlArray() {
this.rssurlarray = getResources().getStringArray(R.array.source_url);
  50:     }
  51:  
/*
     * 初始化rss源的下拉列表
     */
void loadSpinner() {
  56:         ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter
this, R.array.source_title,
  58:                         R.layout.newstitle);
  59:         spinnerAdapter
  60:                 .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  61:         rssSelectSpinner.setAdapter(spinnerAdapter);
  62:         rssSelectSpinner
new OnItemSelectedListener() {
  64:  
void onItemSelected(AdapterView<?> parent,
long id) {
  67:                         parent.setVisibility(View.VISIBLE);
this.rssurlarray[pos];
  69:                     }
  70:  
void onNothingSelected(AdapterView parent) {
// Do nothing.
  73:                     }
  74:                 });
  75:     }
  76:  
/*
     * (non-Javadoc)
     * 
     * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
     * 初期只做三个菜单项,分别是更新rss,关于和退出
     */
  83:     @Override
boolean onCreateOptionsMenu(Menu menu) {
  85:         MenuInflater inflater = getMenuInflater();
  86:         inflater.inflate(R.menu.menu, menu);
return true;
  88:     }
  89:  
  90:     @Override
boolean onOptionsItemSelected(MenuItem item) {
int item_id = item.getItemId();
switch (item_id) {
// 如果是点击了更新菜单,则重新加载一个rss新闻
case R.id.refresh:
this.loadRss();
break;
// 如果是点击了关于菜单,则弹出对话框,在其中显示一些关于我的信息,初期不挂赢利性广告
case R.id.about:
this);
 101:             aboutDialog.setTitle(R.string.aboutme);
 102:             aboutDialog.setMessage(R.string.about_info);
new OnClickListener() {
 104:  
 105:                 @Override
int which) {
 107:                     dialog.dismiss();
 108:                 }
 109:             });
 110:             aboutDialog.create().show();
break;
// 如果点击的是退出菜单,则退出Activity,由于整个应用程序只有一个Activity,则退出了应用程序
case R.id.exit:
this.finish();
break;
 116:         }
return true;
 118:     }
 119:  
/*
     * 根据现在选中的spinner来加载对应的新闻
     */
void loadRss() {
this.currentRssurl == null) {
);
else {
this.currentRssurl);
this.currentRssurl);
this.messages = rssparser.parse();
 130:  
this.messages.size());
this.messages.size());
this.messages) {
 134:                 titles.add(msg.getTitle());
 135:             }
this,
 137:                     R.layout.newstitle, titles);
this.setListAdapter(adapter);
 139:         }
 140:     }
 141:  
/*
     * 显示一些提示信息
     */
void showTips(String tip) {
this, tip, Toast.LENGTH_SHORT);
 147:         toast.setGravity(Gravity.CENTER, 0, 10);
 148:         toast.show();
 149:     }
 150:  
/*
     * (non-Javadoc)
     * 
     * @see android.app.ListActivity#onListItemClick(android.widget.ListView,
     * android.view.View, int, long)
     * 重写ListActivity的方法,当listview中的某条新闻被点击选中,则打开对应新闻的url链接
     */
 158:     @Override
long id) {
super.onListItemClick(l, v, position, id);
new Intent(Intent.ACTION_VIEW,
this.messages.get(position).getLink()
 163:                         .toExternalForm()));
this.startActivity(viewMessage);
 165:     }
 166: }

 

三.一些补充
1.rss解析的额外改动   
现在需要注意的是,因为android虚拟机的默认支持的编码和我本机的不一样,导致这样一个结果:

   1: SAXParser parser = factory.newSAXParser();
new RssHandler();
this.rssurl, myxmlhandler);
这三行代码执行的结果是,logcat报错"not well-formed".解决这个问题的办法是,指定sax 解析的xml流的编码:
this.rssurl);
   2: InputStream inputStream=url.openStream();
// 在此处声明GBK方式
new InputStreamReader(inputStream, charset);
new InputSource(r);
   6: parser.parse(source,myxmlhandler);
   7: inputStream.close();
四.上图收尾
1.加载QQ国内新闻
一个简单的android 下的rss阅读器的实现
2.关于我
一个简单的android 下的rss阅读器的实现

相关文章: