android新闻端demo
16lz
2022-03-28
学习了有一个多星期的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
这个类
第二步:为每一个新闻项自定义一个布局文件
<?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>
第三步:开始编写逻辑文件
packagecom.zaizai.news;importandroid.os.Handler;importandroid.os.Message;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.LayoutInflater;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ListView;importandroid.widget.TextView;importandroid.widget.Toast;importcom.loopj.android.image.SmartImageView;importcom.zaizai.news.domain.NewsInfo;importorg.apache.http.HttpResponse;importorg.apache.http.client.HttpClient;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.DefaultHttpClient;importorg.xmlpull.v1.XmlPullParser;importorg.xmlpull.v1.XmlPullParserFactory;importjava.io.IOException;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;publicclassMainActivityextendsAppCompatActivity{privatestaticfinalStringTAG="MainActivity";privatefinalintSUCCESS=0;privatefinalintFAILED=1;privateListViewlvNews=null;privateList<NewsInfo>list=null;privateHandlerhandler=newHandler(){/*接受消息*/@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseSUCCESS://访问成功/*将数据绑定到listView中*/list=(List<NewsInfo>)msg.obj;MyAdapermyAdaper=newMyAdaper();lvNews.setAdapter(myAdaper);break;caseFAILED://访问失败Toast.makeText(MainActivity.this,"当前网络崩溃了",Toast.LENGTH_LONG).show();break;default:break;}super.handleMessage(msg);}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}privatevoidinit(){lvNews=(ListView)findViewById(R.id.lv_news);//抓取新闻数据/*创建一个线程进行数据下载*/newThread(newRunnable(){/*子线程不能修改UI界面的状态,可通过hander*/@Overridepublicvoidrun(){/*获得新闻信息集合*/List<NewsInfo>newInfList=getNewsFromInternet();/*newInflist==NUll时*/Messagemessage=newMessage();if(newInfList!=null){message.what=SUCCESS;message.obj=newInfList;}else{message.what=FAILED;}handler.sendMessage(message);}}).start();//绑定数据}/***返回新闻信息*/privateList<NewsInfo>getNewsFromInternet(){HttpClienthttpclient=null;try{/*定义一个httpClient客户端*/httpclient=newDefaultHttpClient();/*定义get方法*/HttpGetget=newHttpGet("http://192.168.9.1:8080/new.xml");/*执行请求方法*/HttpResponsehttpResponse=httpclient.execute(get);intstatusCode=httpResponse.getStatusLine().getStatusCode();if(statusCode==200){InputStreaminputStream=httpResponse.getEntity().getContent();List<NewsInfo>newsInfos=getNewsListFromInputStream(inputStream);returnnewsInfos;}else{Log.i(TAG,"访问失败:"+statusCode);}}catch(IOExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}finally{if(httpclient!=null){/*关闭可释放资源*/httpclient.getConnectionManager().shutdown();}}returnnull;}/***从inputStream流中解析newlist**@paramis*@return*/privateList<NewsInfo>getNewsListFromInputStream(InputStreamis)throwsException{XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();//创建一个xmlpull解析器的工厂XmlPullParserparser=factory.newPullParser();parser.setInput(is,"UTF-8");inteventType=parser.getEventType();List<NewsInfo>infoList=null;NewsInfonewsInfo=null;while(eventType!=XmlPullParser.END_DOCUMENT){/*当未解析到文档的结尾处时*/StringtagName=parser.getName();//获得节点名称switch(eventType){caseXmlPullParser.START_TAG://<news>if("news".equals(tagName)){infoList=newArrayList<NewsInfo>();}elseif("new".equals(tagName)){newsInfo=newNewsInfo();}elseif("title".equals(tagName)&&newsInfo!=null){newsInfo.setTitle(parser.nextText());}elseif("detail".equals(tagName)&&newsInfo!=null){newsInfo.setDetail(parser.nextText());}elseif("comment".equals(tagName)&&newsInfo!=null){newsInfo.setComment(Integer.valueOf(parser.nextText()));}elseif("image".equals(tagName)&&newsInfo!=null){newsInfo.setImageUrl(parser.nextText());}break;caseXmlPullParser.END_TAG://</news>if("new".equals(tagName)&&newsInfo!=null){infoList.add(newsInfo);}default:break;}eventType=parser.next();//取下一个事件类型}returninfoList;}/*与ListView绑定*/classMyAdaperextendsBaseAdapter{@OverridepublicintgetCount(){/*litView列表的长度等于数据的大小*/returnlist.size();}/***返回类表子条目的布局*@paramposition*@paramconvertView*@paramparent*@return*/@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){Viewview=null;if(convertView==null){LayoutInflaterinflater=getLayoutInflater();view=inflater.inflate(R.layout.listview_item,null);}else{view=convertView;}/*重新赋值,不会产生缓存对象中原有数据保留的现象*/SmartImageViewsivIcon=(SmartImageView)view.findViewById(R.id.siv_listvie_item_icon);TextViewtvTitle=(TextView)view.findViewById(R.id.tv_listview_item_title);TextViewtvDetail=(TextView)view.findViewById(R.id.tv_listview_item_detail);TextViewtvComment=(TextView)view.findViewById(R.id.tv_listview_item_comment);NewsInfonewsInfo=list.get(position);sivIcon.setImageUrl(newsInfo.getImageUrl());tvTitle.setText(newsInfo.getTitle());tvDetail.setText(newsInfo.getDetail());tvComment.setText(newsInfo.getComment()+"跟帖");returnview;}@OverridepublicObjectgetItem(intposition){returnnull;}@OverridepubliclonggetItemId(intposition){return0;}}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.menu_main,menu);returntrue;}@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//Handleactionbaritemclickshere.Theactionbarwill//automaticallyhandleclicksontheHome/Upbutton,solong//asyouspecifyaparentactivityinAndroidManifest.xml.intid=item.getItemId();//noinspectionSimplifiableIfStatementif(id==R.id.action_settings){returntrue;}returnsuper.onOptionsItemSelected(item);}}
:网络访问时不可使用localhost或者127.0.0.1,否则会抛出访问被拒绝的异常错误
在android studio中导入jar包,直接将jar包考诶到libs目录下,右键将其添加进去即可
更多相关文章
- Android(安卓)数据库SQLite的使用简单Demo
- Android教程之MediaStore
- Android各种访问权限Permission详解
- Android之Adapter用法总结
- Android(安卓)高手进阶教程(十三)之----Android(安卓)数据库SQLi
- Android联系人数据库全解析(1)
- 2010-03-03 传智播客—Android(五)数据存储之五网络数据交互
- Android(安卓)文件上传支持拍照录用录视频
- mybatisplus的坑 insert标签insert into select无参数问题的解决