您的位置:首页 > 移动开发 > Android开发

android新闻端demo

2015-10-08 00:00 513 查看
摘要: 供android入门者参考,

学习了有一个多星期的android了,今天跟着视频来个小案例练习下,在这里记录下:

开发软件 android studio

第一步:先在activity_main.xml文件中写布局代码,这里用一个listview来展示每一条新闻

<RelativeLayout 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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<ListView
android:id="@+id/lv_news"
android:layout_width="wrap_content"
android:layout_height="match_parent">

</ListView>

</RelativeLayout>


知识点补充:

fill_parent

设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。

wrap_content

设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。

match_parent
level8开始fill_parent替换为match_parent,match_parent和fill_parent是一个意思 .两个参数意思一样

tools:context=".MainActivity">


表示,该布局配置文件的使用环境上下文为

MainActivity<
3ff0
/pre>

这个类

第二步:为每一个新闻项自定义一个布局文件

<?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="5dp"
>

<com.loopj.android.image.SmartImageView
android:id="@+id/siv_listvie_item_icon"
android:layout_width="100dip"
android:layout_height="60dip"
android:src="@drawable/a2"
/>
<TextView
android:id="@+id/tv_listview_item_title"
android:layout_toRightOf="@id/siv_listvie_item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="3Q大战宣判:腾讯获赔500万"
android:textColor="@android:color/black"
android:textSize="17sp"/>
<TextView
android:id="@+id/tv_listview_item_detail"
android:layout_alignLeft="@id/tv_listview_item_title"
android:layout_below="@id/tv_listview_item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="sdjsahdkjsahdkjsadhjksahdkj"
android:textColor="@android:color/darker_gray"
android:textSize="14sp"/>
<TextView
android:id="@+id/tv_listview_item_comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="668跟帖"
android:textColor="@android:color/darker_gray"
android:textSize="14sp"/>
</RelativeLayout>


第三步:开始编写逻辑文件

package com.zaizai.news;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.image.SmartImageView;
import com.zaizai.news.domain.NewsInfo;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private final int SUCCESS = 0;
private final int FAILED = 1;
private ListView lvNews = null;
private List<NewsInfo> list = null;
private Handler handler = new Handler() {
/*接受消息*/
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS: //访问成功
/*将数据绑定到listView中*/
list = (List<NewsInfo>) msg.obj;
MyAdaper myAdaper = new MyAdaper();
lvNews.setAdapter(myAdaper);
break;
case FAILED://访问失败
Toast.makeText(MainActivity.this,"当前网络崩溃了",Toast.LENGTH_LONG).show();
break;
default:
break;
}
super.handleMessage(msg);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

init();
}

private void init() {
lvNews = (ListView) findViewById(R.id.lv_news);
//抓取新闻数据
/*创建一个线程进行数据下载*/
new Thread(new Runnable() {
/*子线程不能修改UI界面的状态,可通过hander*/
@Override
public void run() {
/*获得新闻信息集合*/
List<NewsInfo> newInfList = getNewsFromInternet();
/*newInflist==NUll时*/
Message message = new Message();
if (newInfList != null) {
message.what = SUCCESS;
message.obj = newInfList;
} else {
message.what = FAILED;
}

handler.sendMessage(message);
}
}).start();
//绑定数据

}

/**
* 返回新闻信息
*/
private List<NewsInfo> getNewsFromInternet() {
HttpClient httpclient = null;

try {
/*定义一个httpClient客户端*/
httpclient = new DefaultHttpClient();
/*定义get方法*/
HttpGet get = new HttpGet("http://192.168.9.1:8080/new.xml");
/*执行请求方法*/
HttpResponse httpResponse = httpclient.execute(get);
int statusCode = httpResponse.getStatusLine().getStatusCode();
if (statusC
3ff0
ode == 200) {
InputStream inputStream = httpResponse.getEntity().getContent();
List<NewsInfo> newsInfos = getNewsListFromInputStream(inputStream);
return newsInfos;
} else {
Log.i(TAG, "访问失败:" + statusCode);
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (httpclient != null) {
/*关闭可释放资源*/
httpclient.getConnectionManager().shutdown();
}
}
return null;
}

/**
* 从inputStream流中解析newlist
*
* @param is
* @return
*/
private List<NewsInfo> getNewsListFromInputStream(InputStream is) throws Exception {

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//创建一个xmlpull解析器的工厂
XmlPullParser parser = factory.newPullParser();
parser.setInput(is, "UTF-8");
int eventType = parser.getEventType();
List<NewsInfo> infoList = null;
NewsInfo newsInfo = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
/*当未解析到文档的结尾处时*/
String tagName = parser.getName();//获得节点名称

switch (eventType) {
case XmlPullParser.START_TAG: //<news>
if ("news".equals(tagName)) {
infoList = new ArrayList<NewsInfo>();
} else if ("new".equals(tagName)) {
newsInfo = new NewsInfo();
} else if ("title".equals(tagName) && newsInfo != null) {
newsInfo.setTitle(parser.nextText());
} else if ("detail".equals(tagName) && newsInfo != null) {
newsInfo.setDetail(parser.nextText());
} else if ("comment".equals(tagName) && newsInfo != null) {
newsInfo.setComment(Integer.valueOf(parser.nextText()));
} else if ("image".equals(tagName) && newsInfo != null) {
newsInfo.setImageUrl(parser.nextText());
}
break;
case XmlPullParser.END_TAG://</news>
if ("new".equals(tagName) && newsInfo != null) {
infoList.add(newsInfo);
}
default:
break;
}
eventType = parser.next();//取下一个事件类型
}

return infoList;
}
/*与ListView绑定*/
class MyAdaper extends BaseAdapter {

@Override
public int getCount() {
/*litView 列表的长度等于数据的大小*/
return list.size();
}

/**
* 返回类表子条目的布局
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView==null){
LayoutInflater inflater = getLayoutInflater();
view = inflater.inflate(R.layout.listview_item,null);
}else {
view = convertView;
}
/*重新赋值,不会产生缓存对象中原有数据保留的现象*/
SmartImageView sivIcon = (SmartImageView) view.findViewById(R.id.siv_listvie_item_icon);
TextView tvTitle = (TextView) view.findViewById(R.id.tv_listview_item_title);
TextView tvDetail = (TextView) view.findViewById(R.id.tv_listview_item_detail);
TextView tvComment = (TextView) view.findViewById(R.id.tv_listview_item_comment);
NewsInfo newsInfo = list.get(position);

sivIcon.setImageUrl(newsInfo.getImageUrl());
tvTitle.setText(newsInfo.getTitle());
tvDetail.setText(newsInfo.getDetail());
tvComment.setText(newsInfo.getComment()+"跟帖");
return view;
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}


:网络访问时不可使用localhost或者127.0.0.1,否则会抛出访问被拒绝的异常错误

在android studio中导入jar包,直接将jar包考诶到libs目录下,右键将其添加进去即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息