如何使用Android实现接口实信息在留言板显示
下面通过图文并茂的方式给大家分享下如何使用Android实现接口实信息在留言板显示。
看到标题,顾名思义,我今天只是和大家讲一下如何实现接口信息的显示,不包括添加信息。
接口帮助文档:http://api.wzhospital.cn/msg/help>http://api.wzhospital.cn/msg/help<\/a>
根据查看接口文档,我们可以知道接口内部的一些信息结构。
当然,想要查看具体的信息,是通过此链接:http://api.wzhospital.cn/MSG/api/Message/GetList>http://api.wzhospital.cn/MSG/api/Message/GetList<\/a>
获取以下信息,来验证显示的正确性。
<Messagesxmlns:i="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://schemas.datacontract.org/2004/07/LYB.Models"> <Data> <Message> <Content>我的第一个默认留言</Content> <CreateTime>2015-07-3008:29:19</CreateTime> <Messager>林豪</Messager> <MessagerAge>22</MessagerAge> <MessagerSex>女</MessagerSex> <Receiver>林志玲</Receiver> </Message> <Message> <Content>我的第二个默认留言</Content> <CreateTime>2015-07-3008:31:19</CreateTime> <Messager>林志玲</Messager> <MessagerAge>18</MessagerAge> <MessagerSex>女</MessagerSex> <Receiver>刘德华</Receiver> </Message> <Message> <Content> 我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言我的第三个默认留言 </Content> <CreateTime>2015-07-3008:33:19</CreateTime> <Messager>林豪</Messager> <MessagerAge>22</MessagerAge> <MessagerSex>人妖</MessagerSex> <Receiver>林志玲</Receiver> </Message> <Message> <Content>dd</Content> <CreateTime>2015-07-3016:35:57</CreateTime> <Messager>h</Messager> <MessagerAge>0</MessagerAge> <MessagerSex>nn</MessagerSex> <Receiver>mm</Receiver> </Message> <Message> <Content>content</Content> <CreateTime>2015-07-3016:37:49</CreateTime> <Messager>me</Messager> <MessagerAge>18</MessagerAge> <MessagerSex>male</MessagerSex> <Receiver>you</Receiver> </Message> <Message> <Content>12</Content> <CreateTime>2015-07-3016:52:42</CreateTime> <Messager>sk</Messager> <MessagerAge>0</MessagerAge> <MessagerSex>le</MessagerSex> <Receiver>kd</Receiver> </Message> <Message> <Content>content</Content> <CreateTime>2015-07-3017:05:32</CreateTime> <Messager>me</Messager> <MessagerAge>0</MessagerAge> <MessagerSex>youe</MessagerSex> <Receiver>dddd</Receiver> </Message> </Data> </Messages>
首先,我先给大家看一下界面效果图(排版难看,大家谅解)。
><\/a>
><\/a>
第一步:先说一下,整个页面是布局。
这个页面由两部分组成,其一:activity_main.xml中,只包含一个listView.其二:重写了一个list_message.xml. ><\/a>><\/a>
activity_main.xml list_message.xml
关于为什么重写一个.xml文件呢,这是因为listview本身比较复杂,重写一个便于引用显示。
第二步:根据接口文档,建立实体类。
><\/a>
单击GETapi/Message/GetList将获得接口信息,由于我采用的是json的格式,我只截取这一段代码。
><\/a>
根据信息分析,我创建了一个message.java的实体类。
packagecom.example.message.model; importandroid.R.string; publicclassMessage{ privateStringcontent; privateStringcreatime; privateStringmessager; privateStringmessagerAge; privateStringmessagerSex; privateStringreciver; publicStringgetContent(){ returncontent; } publicvoidsetContent(Stringcontent){ this.content=content; } publicStringgetCreatime(){ returncreatime; } publicvoidsetCreatime(Stringcreatime){ this.creatime=creatime; } publicStringgetMessager(){ returnmessager; } publicvoidsetMessager(Stringmessager){ this.messager=messager; } publicStringgetMessagerAge(){ returnmessagerAge; } publicvoidsetMessagerAge(StringmessagerAge){ this.messagerAge=messagerAge; } publicStringgetMessagerSex(){ returnmessagerSex; } publicvoidsetMessagerSex(StringmessagerSex){ this.messagerSex=messagerSex; } publicStringgetReceiver(){ returnreciver; } publicvoidsetReceiver(Stringreciver){ this.reciver=reciver; } publicStringtostring(){ return"content:"+content+",creatime:"+creatime+",Messager:"+messager+",MessagerAge:"+messagerAge+",MessagerSex:"+messagerSex+",Reciver:"+reciver; } }
第三步:我们需要做的是如何获取接口的数据,并且去解析(我将其写于MainActivity.java中)它,那么我们需要新建一个新类,这个我取名为HttpData.java。它的作用就是获取接口中的内容。代码如下:
packagecom.example.message; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importorg.apache.http.HttpEntity; importorg.apache.http.HttpResponse; importorg.apache.http.client.ClientProtocolException; importorg.apache.http.client.HttpClient; importorg.apache.http.client.methods.HttpGet; importorg.apache.http.client.methods.HttpPost; importorg.apache.http.impl.client.DefaultHttpClient; importorg.apache.http.params.HttpParams; publicclassHttpData{ privateHttpClientclient;//定义HTTP一个客户端 privateHttpResponsereponse;//定义一个HTTP响应 privateHttpEntityentity;//定义一个HTTP实体 privateInputStreamin;//定义一个输入流 privateBufferedReaderreader;//定义一个字符流; privateStringBufferdata=newStringBuffer("");//定义一个空的字符串缓冲; privateStringurl="http://api.wzhospital.cn/MSG/api/Message/GetList"; //privateStringurl1="http://api.wzhospital.cn/MSG/api/Message/Add"; privateHttpGetget;//GET:请求的数据随HTTP请求头发过去 publicStringBuffergetData(){//此方法获取接口的文本内容,并以字符流的形式return client=newDefaultHttpClient(); get=newHttpGet(url);//url定向 try{ HttpParamsparams=newHttpParams(){ publicHttpParamssetParameter(Stringarg0,Objectarg1){ //TODOAuto-generatedmethodstub returnnull; } publicHttpParamssetLongParameter(Stringarg0,longarg1){ //TODOAuto-generatedmethodstub returnnull; } publicHttpParamssetIntParameter(Stringarg0,intarg1){ //TODOAuto-generatedmethodstub returnnull; } publicHttpParamssetDoubleParameter(Stringarg0,doublearg1){ //TODOAuto-generatedmethodstub returnnull; } publicHttpParamssetBooleanParameter(Stringarg0,booleanarg1){ //TODOAuto-generatedmethodstub returnnull; } publicbooleanremoveParameter(Stringarg0){ //TODOAuto-generatedmethodstub returnfalse; } publicbooleanisParameterTrue(Stringarg0){ //TODOAuto-generatedmethodstub returnfalse; } publicbooleanisParameterFalse(Stringarg0){ //TODOAuto-generatedmethodstub returnfalse; } publicObjectgetParameter(Stringarg0){ //TODOAuto-generatedmethodstub returnnull; } publiclonggetLongParameter(Stringarg0,longarg1){ //TODOAuto-generatedmethodstub return0; } publicintgetIntParameter(Stringarg0,intarg1){ //TODOAuto-generatedmethodstub return0; } publicdoublegetDoubleParameter(Stringarg0,doublearg1){ //TODOAuto-generatedmethodstub return0; } publicbooleangetBooleanParameter(Stringarg0,booleanarg1){ //TODOAuto-generatedmethodstub returnfalse; } publicHttpParamscopy(){ //TODOAuto-generatedmethodstub returnnull; } }; reponse=client.execute(get);//执行客户端的get操作 entity=reponse.getEntity();//获取响应中是实例 in=entity.getContent();//获取实例中的文本内容 reader=newBufferedReader(newInputStreamReader(in));//读入字符流 Stringline=""; while((line=reader.readLine())!=null){ data.append(line); } returndata; }catch(ClientProtocolExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returndata; } }
第四步:封装数据集合(listview),通过视图绘制,此处采用的是数据适配器绘制。
代码如下:
packagecom.example.message; importjava.util.List; importjava.util.zip.Inflater; importcom.example.message.model.Message; importandroid.content.Context; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.BaseAdapter; importandroid.widget.RelativeLayout; importandroid.widget.TextView; publicclassDataAdapterextendsBaseAdapter{ privateList<Message>messages; privateContextcontext; privateTextViewv_content; privateTextViewv_time; privateTextViewv_messger; privateTextViewv_messgerAge; privateTextViewv_messgerSex; privateTextViewv_receiver; publicDataAdapter(List<Message>messages,Contextcontext){ this.messages=messages; this.context=context; } publicintgetCount(){ returnmessages.size(); } publicObjectgetItem(intarg0){ returnmessages.get(arg0); } publiclonggetItemId(intarg0){ //TODOAuto-generatedmethodstub returnarg0; } publicViewgetView(intarg0,Viewarg1,ViewGrouparg2){ RelativeLayoutlayout=(RelativeLayout)LayoutInflater.from(context).inflate(R.layout.list_message,null); Messagemsg=(Message)getItem(arg0); v_content=(TextView)layout.findViewById(R.id.Content); v_time=(TextView)layout.findViewById(R.id.CreateTime); v_messger=(TextView)layout.findViewById(R.id.Meassger); v_receiver=(TextView)layout.findViewById(R.id.Receiver); v_messgerAge=(TextView)layout.findViewById(R.id.MessagerAge); v_messgerSex=(TextView)layout.findViewById(R.id.MessagerSex); v_content.setText(msg.getContent()); v_time.setText(msg.getCreatime()); v_messger.setText(msg.getMessager()); v_receiver.setText(msg.getReceiver()); v_messgerAge.setText(msg.getMessagerAge()); v_messgerSex.setText(msg.getMessagerSex()); returnlayout; } }
第五步:我们来看一看MainActivity.java是如何调用方法获取数据,并解析的。此处额外新开了一个子线程,进行操作。代码如下:
packagecom.example.message; importandroid.os.Bundle; importandroid.os.Handler; importandroid.app.Activity; importandroid.view.Menu; importjava.io.FileOutputStream; importjava.io.InputStream; importjava.util.ArrayList; importjava.util.List; importorg.json.JSONArray; importorg.json.JSONException; importorg.json.JSONObject; importandroid.app.Activity; importandroid.content.Context; importandroid.os.Bundle; importandroid.util.Log; importandroid.view.View; importandroid.widget.Button; importandroid.widget.ListView; importcom.example.message.model.Message; publicclassMainActivityextendsActivity{ privateList<Message>messages=newArrayList<Message>(); privateDataAdaptermyAdapter;//定义一个自己的适配器,用于绘制 privateHandlerhandler;//定义一个Handler,Handler负责在必要时进行信息格式化 privateListViewlistView; publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView)findViewById(R.id.listView); handler=newHandler(){ publicvoidhandleMessage(android.os.Messagemsg){ if(msg.what==0x123){ System.out.println("接收数据"); for(Messageg:messages){ System.out.println(g.getContent()); } myAdapter=newDataAdapter(messages,MainActivity.this); listView.setAdapter(myAdapter); } }; }; newThread(newRunnable(){ publicvoidrun(){ //TODOAuto-generatedmethodstub HttpDatadata=newHttpData(); StringBufferstr=data.getData(); System.out.println(str.toString()); Log.v("msg",str.toString()); try{ JSONObjectobject=newJSONObject(str.toString());//使用json,解析数据 JSONArraymsg=(JSONArray)object.get("Data"); for(inti=0;i<msg.length();i++){ JSONObjecto=msg.getJSONObject(i); Messagemessage=newMessage(); message.setContent(o.getString("Content")); message.setCreatime(o.getString("CreateTime")); message.setMessager(o.getString("Messager")); message.setMessagerAge(o.getString("MessagerAge")); message.setMessagerSex(o.getString("MessagerSex")); message.setReceiver(o.getString("Receiver")); messages.add(message); } android.os.MessagehandlerMsg=newandroid.os.Message(); handlerMsg.what=0x123; handler.sendMessage(handlerMsg); System.out.println("发送数据"); }catch(JSONExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }).start(); } }
以上,就是实现接口留言板的显示。有以下几点,是在我写的时候遇到的问题。
1、个别电脑的虚拟机和电脑设置的问题,程序可能跑不起来,建议使用安卓真机。
2、由于我们的程序存在网络访问,需要在网络访问配置文件当中加写权限设置。
3、有关网络方面的东西,都必须写在子线程上,这就是为什么我重新开了一个新的线程。
4、控件的更新必须在主线程上,否则将出错。
5、当我们使用适配器绘制时,其中getCount这个方法必须要写。
以上就是本文的全部内容,希望大家喜欢。