如何使用Android實(shí)現(xiàn)接口實(shí)信息在留言板顯示
下面通過圖文并茂的方式給大家分享下如何使用Android實(shí)現(xiàn)接口實(shí)信息在留言板顯示。
看到標(biāo)題,顧名思義,我今天只是和大家講一下如何實(shí)現(xiàn)接口信息的顯示,不包括添加信息。
接口幫助文檔:http://api.wzhospital.cn/msg/help
根據(jù)查看接口文檔,我們可以知道接口內(nèi)部的一些信息結(jié)構(gòu)。
當(dāng)然,想要查看具體的信息,是通過此鏈接:http://api.wzhospital.cn/MSG/api/Message/GetList
獲取以下信息,來驗(yàn)證顯示的正確性。
<Messages xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/LYB.Models"> <Data> <Message> <Content>我的第一個默認(rèn)留言</Content> <CreateTime>2015-07-30 08:29:19</CreateTime> <Messager>林豪</Messager> <MessagerAge>22</MessagerAge> <MessagerSex>女</MessagerSex> <Receiver>林志玲</Receiver> </Message> <Message> <Content>我的第二個默認(rèn)留言</Content> <CreateTime>2015-07-30 08:31:19</CreateTime> <Messager>林志玲</Messager> <MessagerAge>18</MessagerAge> <MessagerSex>女</MessagerSex> <Receiver>劉德華</Receiver> </Message> <Message> <Content> 我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言我的第三個默認(rèn)留言 </Content> <CreateTime>2015-07-30 08:33:19</CreateTime> <Messager>林豪</Messager> <MessagerAge>22</MessagerAge> <MessagerSex>人妖</MessagerSex> <Receiver>林志玲</Receiver> </Message> <Message> <Content>dd</Content> <CreateTime>2015-07-30 16:35:57</CreateTime> <Messager>h</Messager> <MessagerAge>0</MessagerAge> <MessagerSex>nn</MessagerSex> <Receiver>mm</Receiver> </Message> <Message> <Content>content</Content> <CreateTime>2015-07-30 16:37:49</CreateTime> <Messager>me</Messager> <MessagerAge>18</MessagerAge> <MessagerSex>male</MessagerSex> <Receiver>you</Receiver> </Message> <Message> <Content>12</Content> <CreateTime>2015-07-30 16:52:42</CreateTime> <Messager>sk</Messager> <MessagerAge>0</MessagerAge> <MessagerSex>le</MessagerSex> <Receiver>kd</Receiver> </Message> <Message> <Content>content</Content> <CreateTime>2015-07-30 17:05:32</CreateTime> <Messager>me</Messager> <MessagerAge>0</MessagerAge> <MessagerSex>youe</MessagerSex> <Receiver>dddd</Receiver> </Message> </Data> </Messages>
首先,我先給大家看一下界面效果圖(排版難看,大家諒解)。
第一步:先說一下,整個頁面是布局。
這個頁面由兩部分組成,其一:activity_main.xml中,只包含一個listView.其二:重寫了一個list_message.xml.
activity_main.xml list_message.xml
關(guān)于為什么重寫一個.xml文件呢,這是因?yàn)閘istview本身比較復(fù)雜,重寫一個便于引用顯示。
第二步:根據(jù)接口文檔,建立實(shí)體類。
單擊 GET api/Message/GetList 將獲得接口信息,由于我采用的是json的格式,我只截取這一段代碼。
根據(jù)信息分析,我創(chuàng)建了一個message.java的實(shí)體類。
package com.example.message.model;
import android.R.string;
public class Message {
private String content;
private String creatime;
private String messager;
private String messagerAge;
private String messagerSex;
private String reciver;
public String getContent() {
return content;
}
public void setContent(String content){
this.content=content;
}
public String getCreatime() {
return creatime;
}
public void setCreatime(String creatime) {
this.creatime=creatime;
}
public String getMessager() {
return messager;
}
public void setMessager(String messager) {
this.messager=messager;
}
public String getMessagerAge() {
return messagerAge;
}
public void setMessagerAge(String messagerAge) {
this.messagerAge=messagerAge;
}
public String getMessagerSex() {
return messagerSex;
}
public void setMessagerSex(String messagerSex) {
this.messagerSex=messagerSex;
}
public String getReceiver() {
return reciver;
}
public void setReceiver(String reciver) {
this.reciver=reciver;
}
public String tostring() {
return "content:"+content+",creatime:"+creatime+",Messager:"+messager+",MessagerAge:"+messagerAge+",MessagerSex:"+messagerSex+",Reciver:"+reciver;
}
}
第三步:我們需要做的是如何獲取接口的數(shù)據(jù),并且去解析(我將其寫于MainActivity.java中)它,那么我們需要新建一個新類,這個我取名為HttpData.java。它的作用就是獲取接口中的內(nèi)容。代碼如下:
package com.example.message;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpParams;
public class HttpData {
private HttpClient client;//定義HTTP一個客戶端
private HttpResponse reponse;//定義一個HTTP響應(yīng)
private HttpEntity entity;//定義一個HTTP實(shí)體
private InputStream in;//定義一個輸入流
private BufferedReader reader;//定義一個字符流;
private StringBuffer data = new StringBuffer("");//定義一個空的字符串緩沖;
private String url = "http://api.wzhospital.cn/MSG/api/Message/GetList";
//private String url1="http://api.wzhospital.cn/MSG/api/Message/Add";
private HttpGet get;//GET:請求的數(shù)據(jù)隨HTTP請求頭發(fā)過去
public StringBuffer getData(){//此方法獲取接口的文本內(nèi)容,并以字符流的形式return
client = new DefaultHttpClient();
get = new HttpGet(url);//url定向
try {
HttpParams params = new HttpParams() {
public HttpParams setParameter(String arg0, Object arg1) {
// TODO Auto-generated method stub
return null;
}
public HttpParams setLongParameter(String arg0, long arg1) {
// TODO Auto-generated method stub
return null;
}
public HttpParams setIntParameter(String arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
public HttpParams setDoubleParameter(String arg0, double arg1) {
// TODO Auto-generated method stub
return null;
}
public HttpParams setBooleanParameter(String arg0, boolean arg1) {
// TODO Auto-generated method stub
return null;
}
public boolean removeParameter(String arg0) {
// TODO Auto-generated method stub
return false;
}
public boolean isParameterTrue(String arg0) {
// TODO Auto-generated method stub
return false;
}
public boolean isParameterFalse(String arg0) {
// TODO Auto-generated method stub
return false;
}
public Object getParameter(String arg0) {
// TODO Auto-generated method stub
return null;
}
public long getLongParameter(String arg0, long arg1) {
// TODO Auto-generated method stub
return 0;
}
public int getIntParameter(String arg0, int arg1) {
// TODO Auto-generated method stub
return 0;
}
public double getDoubleParameter(String arg0, double arg1) {
// TODO Auto-generated method stub
return 0;
}
public boolean getBooleanParameter(String arg0, boolean arg1) {
// TODO Auto-generated method stub
return false;
}
public HttpParams copy() {
// TODO Auto-generated method stub
return null;
}
};
reponse = client.execute(get);//執(zhí)行客戶端的get操作
entity = reponse.getEntity();//獲取響應(yīng)中是實(shí)例
in = entity.getContent();//獲取實(shí)例中的文本內(nèi)容
reader = new BufferedReader(new InputStreamReader(in));//讀入字符流
String line = "";
while( (line = reader.readLine()) != null ){
data.append(line);
}
return data;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
}
第四步:封裝數(shù)據(jù)集合(listview),通過視圖繪制,此處采用的是數(shù)據(jù)適配器繪制。
代碼如下:
package com.example.message;
import java.util.List;
import java.util.zip.Inflater;
import com.example.message.model.Message;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class DataAdapter extends BaseAdapter{
private List<Message> messages;
private Context context;
private TextView v_content;
private TextView v_time;
private TextView v_messger;
private TextView v_messgerAge;
private TextView v_messgerSex;
private TextView v_receiver;
public DataAdapter(List<Message> messages, Context context){
this.messages = messages;
this.context = context;
}
public int getCount() {
return messages.size();
}
public Object getItem(int arg0) {
return messages.get(arg0);
}
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public View getView(int arg0, View arg1, ViewGroup arg2) {
RelativeLayout layout = (RelativeLayout)LayoutInflater.from(context).inflate(R.layout.list_message, null);
Message msg = (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());
return layout;
}
}
第五步:我們來看一看MainActivity.java是如何調(diào)用方法獲取數(shù)據(jù),并解析的。此處額外新開了一個子線程,進(jìn)行操作。代碼如下:
package com.example.message;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import com.example.message.model.Message;
public class MainActivity extends Activity {
private List<Message> messages = new ArrayList<Message>();
private DataAdapter myAdapter; //定義一個自己的適配器,用于繪制
private Handler handler;//定義一個Handler,Handler 負(fù)責(zé)在必要時(shí)進(jìn)行信息格式化
private ListView listView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if(msg.what == 0x123){
System.out.println("接收數(shù)據(jù)");
for(Message g:messages){
System.out.println(g.getContent());
}
myAdapter = new DataAdapter(messages, MainActivity.this);
listView.setAdapter(myAdapter);
}
};
};
new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
HttpData data = new HttpData();
StringBuffer str = data.getData();
System.out.println(str.toString());
Log.v("msg", str.toString());
try {
JSONObject object = new JSONObject(str.toString());//使用json ,解析數(shù)據(jù)
JSONArray msg = (JSONArray)object.get("Data");
for(int i=0; i<msg.length(); i++){
JSONObject o = msg.getJSONObject(i);
Message message = new Message();
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.Message handlerMsg = new android.os.Message();
handlerMsg.what = 0x123;
handler.sendMessage(handlerMsg);
System.out.println("發(fā)送數(shù)據(jù)");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
以上,就是實(shí)現(xiàn)接口留言板的顯示。有以下幾點(diǎn),是在我寫的時(shí)候遇到的問題。
1、個別電腦的虛擬機(jī)和電腦設(shè)置的問題,程序可能跑不起來,建議使用安卓真機(jī)。
2、由于我們的程序存在網(wǎng)絡(luò)訪問,需要在網(wǎng)絡(luò)訪問配置文件當(dāng)中加寫權(quán)限設(shè)置。
3、有關(guān)網(wǎng)絡(luò)方面的東西,都必須寫在子線程上,這就是為什么我重新開了一個新的線程。
4、控件的更新必須在主線程上,否則將出錯。
5、當(dāng)我們使用適配器繪制時(shí),其中g(shù)etCount這個方法必須要寫。
以上就是本文的全部內(nèi)容,希望大家喜歡。
相關(guān)文章
Android中LinearLayout布局的常用屬性總結(jié)
這篇文章主要介紹了Android中LinearLayout布局的常用屬性總結(jié),包括居中、重心、比例等線性布局中的基本設(shè)置,需要的朋友可以參考下2016-04-04
Flutter?彈性布局基石flex算法flexible示例詳解
這篇文章主要為大家介紹了Flutter?彈性布局基石flex算法flexible示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android調(diào)用默認(rèn)瀏覽器打開指定Url的方法實(shí)例
業(yè)務(wù)員有需求要將一個wap站在手機(jī)上以App的形式打開,還不要嵌套WebView,只能以瀏覽器打開.查了點(diǎn)資料,就有了下面這代碼2013-09-09
Kotlin學(xué)習(xí)筆記之const val與val
這篇文章主要給大家介紹了關(guān)于Kotlin學(xué)習(xí)筆記之const val與val的相關(guān)資料,并給大家介紹了const val和val區(qū)別以及Kotlin中var和val的區(qū)別,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
Android 3.0引入的異步加載機(jī)制Loader
Loader裝載器從android3.0開始引進(jìn)。它使得在activity或fragment中異步加載數(shù)據(jù)變得簡單。下面我們就來詳細(xì)講解下2017-12-12
Android仿微信頁面底部導(dǎo)航效果代碼實(shí)現(xiàn)
本文給大家分享一段代碼有關(guān)android仿微信頁面底部導(dǎo)航效果代碼實(shí)現(xiàn)的思路,非常不錯,感興趣的朋友一起看看吧2016-09-09
Android編程開發(fā)之TextView控件用法(2種方法)
這篇文章主要介紹了Android編程開發(fā)之TextView控件用法,結(jié)合實(shí)例分析了Android針對TextView控件固定顯示與動態(tài)獲取顯示的兩種使用技巧,需要的朋友可以參考下2015-12-12





