public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
ListView listview = null;
List<news> listnew = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();//在应用开始时 执行此方法
}
private void init() {
listview = (ListView) findViewById(R.id.listnew);//得到listview 用于绑定新闻数据
//因为是访问网络,在主线程里4.0以上都不可以了 所以要开启一个子线程。
new Thread(new Runnable() {
@Override
public void run() {
//执行此方法 抓取新闻数据 返回新闻list集合
listnew = getnewfrominternet();
//这个方法可以在子线程中 相当于在ui线程执行
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
myadtper adapter = new myadtper();//listview控件需要一个实现了BaseAdapter的类来实现绑定
listview.setAdapter(adapter);//填充器数据集设置给listview
}
});
}
}).start();
// 绑定数据
}
/**
* 访问网络获取数据
*/
private List<news> getnewfrominternet() {
HttpClient client = null;//new一个httpclint客户端
try {
client = new DefaultHttpClient();//因为httpclient是个 接口不可以直接实现,所以new 一个实现了接口的DefaultHttpClient类
HttpGet get = new HttpGet(
"http://192.168.0.101:8080/NetEaseServer/new.xml");//实例化httpget请求 并设置
HttpResponse response = client.execute(get);//执行请求 返回值是httprespones 对象
int code = response.getStatusLine().getStatusCode();//这个是从客户端请求返回对象里获得 执行状态码
if (code == 200) {
InputStream is = response.getEntity().getContent();//从返回对象里获得返回流
return getnewlistfrominputstream(is);//解析这个流 返回为list的实体集合
} else {
Log.i(TAG, "访问失败:" + code);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (client != null) {
client.getConnectionManager().shutdown();//关闭客户端 首先获得一客户端管理对象,在给他shutdown
}
}
return null;
}
/**
* 得到新闻list从流中,解析流
*
* @param is
* @return
* @throws Exception
*/
private List<news> getnewlistfrominputstream(InputStream is)
throws Exception {
XmlPullParser pull = Xml.newPullParser();// 获得pull解析器
pull.setInput(is, "utf-8");// 定义解析器 解析流和编码
int eventype = pull.getEventType();//获得事件类型
List<news> list = null;
news newtemp = null;
while (eventype != XmlPullParser.END_DOCUMENT)// 判断是否循环到结尾
{
String tagname = pull.getName();// 节点名称
switch (eventype) {
case XmlPullParser.START_TAG://开始节点
//<news>
if ("news".equals(tagname)) {
list = new ArrayList<news>();
}
//<new>
else if ("new".equals(tagname)) {
newtemp = new news();
}
//<title>
else if ("title".equals(tagname)) {
newtemp.setTitle(pull.nextText());
} else if ("detail".equals(tagname)) {
newtemp.setDetali(pull.nextText());
} else if ("comment".equals(tagname)) {
newtemp.setComment(Integer.valueOf(pull.nextText()));
} else if ("image".equals(tagname)) {
newtemp.setImageurl(pull.nextText());
}
break;
case XmlPullParser.END_TAG://判断一个实体xml是否结束 结束就添加到list集合里
if ("new".equals(tagname)) {
list.add(newtemp);
}
break;
}
eventype = pull.next();// 下一个事件
}
return list;
}
class myadtper extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return listnew.size();// 返回总长度
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
/**
* 返回item的子条目 布局
*/
@Override
public View getView(int position, View converview, ViewGroup parent) {
View view = null;
//判断是否为空 为空就 实例化一个 不为空 就从缓存里直接使用
if (converview == null) {
LayoutInflater lay = getLayoutInflater();//实例化一个打气筒
view = lay.inflate(R.layout.listview_item, null);//设置list item的样式 xml 需要另外定义
} else {
view = converview;
}
//这个理获得 界面上的控件,这里不能直接用findViewById(R.id.listnew) 因为这些控件不在这个界面下 需要在view里获得
SmartImageView sivicon = (SmartImageView) view
.findViewById(R.id.siv_listview_item_icon);
TextView tv_title = (TextView) view.findViewById(R.id.title);
TextView tv_comment = (TextView) view.findViewById(R.id.comm);
TextView tv_content = (TextView) view.findViewById(R.id.content);
news ns = listnew.get(position);
sivicon.setImageUrl(ns.getImageurl());
tv_title.setText(ns.getTitle());
tv_content.setText(ns.getDetali());
tv_comment.setText(ns.getComment() + "跟帖");
return view;
}
}
}
简单的新闻列表页面
最新推荐文章于 2023-12-03 23:58:56 发布