android新闻端demo
2015-10-08 00:00
513 查看
摘要: 供android入门者参考,
学习了有一个多星期的android了,今天跟着视频来个小案例练习下,在这里记录下:
开发软件 android studio
第一步:先在activity_main.xml文件中写布局代码,这里用一个listview来展示每一条新闻
知识点补充:
fill_parent
设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。
wrap_content
设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。
match_parent
level8开始fill_parent替换为match_parent,match_parent和fill_parent是一个意思 .两个参数意思一样
表示,该布局配置文件的使用环境上下文为
学习了有一个多星期的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目录下,右键将其添加进去即可
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories