创建新闻客户端

来源:互联网 发布:知乎 许嵩 李荣浩 编辑:程序博客网 时间:2024/06/08 08:48

这次的内容是要实现获取服务器的xml文件并将其解析显示到ListView。首先,还是设计一个布局文件在activity-main,如下所示,

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity"    android:orientation="vertical">    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <LinearLayout            android:id="@+id/loading"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:gravity="center"            android:orientation="vertical"            android:visibility="invisible">            <ProgressBar                android:layout_width="wrap_content"                android:layout_height="wrap_content" />            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="正在加载信息..." />        </LinearLayout>        <ListView            android:id="@+id/lv_news"            android:layout_width="match_parent"            android:layout_height="match_parent" />    </FrameLayout></LinearLayout>

布局中既然用到了ListView控件,就要为ListView的item做一个布局,布局文件news-item如下,

<?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="65dp">    <com.loopj.android.image.SmartImageView        android:id="@+id/siv_icon"        android:layout_width="80dp"        android:layout_height="60dp"        android:scaleType="centerCrop"        android:src="@mipmap/ic_launcher"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true"></com.loopj.android.image.SmartImageView>    <TextView        android:id="@+id/tv_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="5dp"        android:layout_marginTop="10dp"        android:layout_toRightOf="@id/siv_icon"        android:ellipsize="end"        android:maxLength="20"        android:singleLine="true"        android:text="我是标题"        android:textColor="#000000"        android:textSize="18sp" />    <TextView        android:id="@+id/tv_description"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/tv_title"        android:layout_marginLeft="5dp"        android:layout_marginTop="5dp"        android:layout_toRightOf="@id/siv_icon"        android:ellipsize="end"        android:maxLength="16"        android:maxLines="1"        android:text="我是描述"        android:textColor="#99000000"        android:textSize="14sp" />    <TextView        android:id="@+id/tv_type"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:layout_marginBottom="5dp"        android:layout_marginRight="10dp"        android:text="评论"        android:textColor="#99000000"        android:textSize="12sp" /></RelativeLayout>

上述使用的SmartImageView用于新闻标题,内容,评论数的TextView,使用该属性需要下载需要下载其源代码,这点可从网上搜索下载,,

在Item布局里用到NewsInfo JavaBean对象,NewsInfo对象是新闻信息的JavaBean,代码如下,

public class NewsInfo {    private String iconPath;    private String title;    private String description;    private int type;    private long comment;    public String getIconPath() {        return iconPath;    }    public String getTitle() {        return title;    }    public int getType() {        return type;    }    public String getDescription() {        return description;    }    public long getComment() {        return comment;    }    public void setIconPath(String iconPath) {        this.iconPath = iconPath;    }    public void setTitle(String title) {        this.title = title;    }    public void setDescription(String description) {        this.description = description;    }    public void setComment(long comment) {        this.comment = comment;    }    public void setType(int type) {        this.type = type;    }}

下面接着编写界面交互,然后创建工具类解析XML文件以及配置服务器,一步步的进行,先编写界面交互

public class MainActivity extends Activity{   private ListView lv_news;   private LinearLayout loading;   private List<NewsInfo>newsInfos;   private class NewsAdapter extends BaseAdapter{   public int getCount(){      return newsInfos.size();}public View getView(int position,View convertView,ViewGroup parent){   View view=View.inflate(MainActivity.this,R.layout.news_item,null);   SmartImageView siv=(SmartImageView)view.findViewById(R.id.siv_icon);   TextView tv_title=(TextView)view.findVoewById(R.id.tv_title);   TextView tv_description=(TextView)view.findViewById(R.id.tv_description);   TextView tv_type=(TextView)view.findViewById(R.id.tv.type);   NewsInfo newsInfo=newsInfos.get(position);   siv.setImageUrl(newsInfo.getIconPath(),R.drawable.ab,R.drawable.ic_launcher);   tv_title.setText(newsInfo.getTitle());   tv_description.setText(newsInfo.getDescription());   int type=newsInfo.getType();   switch(type){   case 1:      tv_type.setText("评论:"+newsInfo.getComment());      break;   case 2:      tv_type.setTextColor(Color.RED);      tv_type.setText("专题");      break;   case 3:      tv_type.setTextColor(Color.BLUE);      tv_type.setText("LIVE");      break;   }   return view;}  public Object getItem(int position){   return null;  }  public long getItemId(int position){   return 0;  }}protected void onCreate(Bundle savedInstanceState){  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  lv_news=(ListView)findViewById(R.id.iv_news);  loading=(LinearLayout)findViewById(R.id.loading);  fillData2();}private void fillData2(){  AsyncHttpClient asyncHttpClient=new AsyncHttpClient();   asyncHttpClient.get(getString(R.string.serverurl),new AsyncHttpResponseHandler() {        public void onSuccess(String content){           super.onSuccess(content);           byte[] bytes=content.getBytes();           ByteArrayInputStream bais=new ByteArrayInputStream(bytes);           newsInfos=NewsInfoService.getNewsInfos(bais);           if(newsInfos==null){              Toast.makeText(MainActivity.this,"解析失败",0).show();           }else{              loading.setVisibility(View.INVISIBLE);              lv_news.setAdapter(new NewsAdapter());           }         }         public void onFailure(Throwable error,String content){            super.onFailure(error,content);            Toast.makeText(MainActivity.this,"请求失败",0).show();         }      });    }}

接下来该创建工具类解析XML文件

 public class NewsInfoService{    public static List<NewsInfo>getNewsInfos(InputStream is){      XmlPullParser parser=Xml.newPullParser();      try{         parser.setInput(is,"utf-8");         int type=parser.getEventType();         List<NewsInfo>newsInfos=null;         NewsInfo newsInfo=null;      while(type!=XmlPullParser.END_DOCUMENT){         switch(type);         case XmlPullParser.START_TAG:            if("news".equals(parser.getName())){               newsInfos=new ArrayList<NewsInfo>();            }else if("newsInfo".equals(parser.getName())){               newsInfo=new NewsInfo();            }else if("icon".equals(parser.getName())){               String icon=parser.nextText();               newsInfo.setIconPath(icon);            }else if("title".equals(parser.getName())){               String title=parser.nextText();               newsInfo.setTitle(title);            }else if("content".equals(parser.getName())){               String description=parser.nextText();               newsInfo.setDescription(description);            }else if("type".equals(parser.getName())){               String newsType=parser.nextText();               newsInfo.setType(Integer.parser.getName());            }else if("comment".equals(parser.getName())){               String comment=parser.nextText();               newsInfo.setComment(Long.parseLong(comment));            }            break;         case XmlPullParser.END_TAG:            if("newsInfo".equals(parser.getName())){               newsInfos.add(newsInfo);               mewsInfo=null;            }            break;          }          type=parser.next();       }       return newsInfos;    }catch(Exception e){      e.printStackTrace();      return null;    }    }}

最后从服务器下载个XML,配置服务器,

<?xml version="1.0" encoding="utf-8"?><news>    <newsInfo>        <icon>http://172.16.25.13:8080/img/a.jpg</icon>        <title>科技温暖世界</title>        <content>进入一个更有爱的领域</content>        <type>1</type>        <comment>69</comment>    </newsInfo>    <newsInfo>        <icon>http://172.16.25.13:8080/img/b.jpg</icon>        <title>《神武》</title>        <content>新美术资源盘点 视觉新体验</content>        <type>2</type>        <comment>35</comment>    </newsInfo>    <newsInfo>        <icon>http://172.16.25.13:8080/img/c.jpg</icon>        <title>南北车正式公布合并</title>        <content>南北车将于今日正式公布合并</content>        <type>3</type>        <comment>2</comment>    </newsInfo>    <newsInfo>        <icon>http://172.16.25.13:8080/img/d.jpg</icon>        <title>北京拟推医生电子注册</title>        <content>突破多点执业“限制”</content>        <type>1</type>        <comment>25</comment>    </newsInfo>    <newsInfo>        <icon>http://172.16.25.13:8080/img/e.jpg</icon>        <title>风力发电进校园</title>        <content>风力发电普进校园</content>        <type>2</type>        <comment>26</comment>    </newsInfo>    <newsInfo>        <icon>http://172.16.25.13:8080/img/f.jpg</icon>        <title>地球一小时</title>        <content>地球熄灯一小时</content>        <type>1</type>        <comment>23</comment>    </newsInfo></news>

下面是运行结果图,这里写图片描述

原创粉丝点击