在請求下的數據中,其中不免有xml數據,反正我是不經常碰到,但是也小小的研究了一下,這裏我們就簡單的解析一下xml數據~~(這裏涉及到刷新和加載和展示數據,可能代碼會長一點,請大家耐心一點)
---------這裏引入Xlistview 第三方類庫--------實現基本的框架
--------------主佈局activity_main---------//一個listview展示數據
<LinearLayout 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:orientation="vertical"
>
<me.maxwin.view.XListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/xlistview"
/>
</LinearLayout>
------------list_item---------------------//展示listview數據
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/item_toux"
android:src="@drawable/ic_launcher"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="暱稱"
android:layout_marginLeft="20dp"
android:id="@+id/item_nicheng"
android:gravity="center_vertical"
android:textColor="#f00"
/>
</LinearLayout>
<TextView
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/item_title"
android:text="新聞標題"
android:maxLines="1"
android:ellipsize="end"
/>
<ImageView
android:layout_width="match_parent"
android:layout_height="140dp"
android:src="@drawable/ic_launcher"
android:id="@+id/item_news_iv"
/>
</LinearLayout>
----------------------------MainActivity-------------------重要方法解釋
這裏pull解析方法 將拿到的流解析
//初始化集合
List<Reason> list=new ArrayList<Reason>();
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(stream, "utf-8");
//開始解析
int type = parser.getEventType();
//循環 如果不結束文檔
while(type!=XmlPullParser.END_DOCUMENT){
String name=parser.getName();
switch (type) {
//開始節點
case XmlPullParser.START_TAG:
if(name.equals("tweet")){
reason = new Reason();
}else if(name.equals("portrait")){
reason.setPortrait(parser.nextText());
}else if(name.equals("body")){
reason.setBody(parser.nextText());
}else if(name.equals("imgSmall")){
reason.setImgSmall(parser.nextText());
}else if(name.equals("name")){
reason.setName(parser.nextText());
}
break;
//結束節點
case XmlPullParser.END_TAG:
if(name.equals("tweet")){
//存入集合
list.add(reason);
//清除 重新開始節點解析
reason=null;
}
break;
default:
break;
}
type=parser.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
這裏是請求數據的方法
// TODO Auto-generated method stub
HttpUtils utils = new HttpUtils();
// 超時時間
utils.configCurrentHttpCacheExpiry(5000);
// get請求方式 請求地址url 回調接口
String myPath = path + "?uid=0&pageIndex=" + index + "&pageSize=20";
utils.send(HttpMethod.GET,
myPath,
new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
// TODO Auto-generated method stub
// 請求數據失敗
}
@Override
public void onSuccess(ResponseInfo<String> arg0) {
reultData = arg0.result;
arrayInputStream = new ByteArrayInputStream(
reultData.getBytes());
// 解析數據xml
handler.sendEmptyMessage(1);
}
});
-----------------------MainActivity---------------------
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import com.hao.bean.Reason;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
import me.maxwin.view.XListView;
import me.maxwin.view.XListView.IXListViewListener;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.util.Xml;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Adapter;
public class MainActivity extends Activity implements IXListViewListener {
private XListView xlistview;
private String reultData;
private String path = "http://www.oschina.net/action/api/tweet_list";
private int index = 0;
private ByteArrayInputStream arrayInputStream;
private MyListAdapter adapter;
private List<Reason> list1=new ArrayList<Reason>();
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
// xml_jiexi
List<Reason> list = xml_jiexi(arrayInputStream);
if(isRefresh){
list1.clear();
}
list1.addAll(list);
// //打印集合
// //適配器
// xlistview.setAdapter(adapter);
if (adapter == null) {
adapter = new MyListAdapter(MainActivity.this,list1);
xlistview.setAdapter(adapter);
} else {
adapter.notifyDataSetChanged();
}
// 消失進度
onLoad();
break;
default:
break;
}
};
};
private Reason reason;
boolean isRefresh = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xlistview = (XListView) findViewById(R.id.xlistview);
xlistview.setPullLoadEnable(true);
xlistview.setPullRefreshEnable(true);
xlistview.setXListViewListener(this);
// 請求網絡數據
request_Data();
}
protected List<Reason> xml_jiexi(InputStream stream) {
// TODO Auto-generated method stub
//初始化集合
List<Reason> list=new ArrayList<Reason>();
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(stream, "utf-8");
//開始解析
int type = parser.getEventType();
//循環 如果不結束文檔
while(type!=XmlPullParser.END_DOCUMENT){
String name=parser.getName();
switch (type) {
//開始節點
case XmlPullParser.START_TAG:
if(name.equals("tweet")){
reason = new Reason();
}else if(name.equals("portrait")){
reason.setPortrait(parser.nextText());
}else if(name.equals("body")){
reason.setBody(parser.nextText());
}else if(name.equals("imgSmall")){
reason.setImgSmall(parser.nextText());
}else if(name.equals("name")){
reason.setName(parser.nextText());
}
break;
//結束節點
case XmlPullParser.END_TAG:
if(name.equals("tweet")){
//存入集合
list.add(reason);
//清除 重新開始節點解析
reason=null;
}
break;
default:
break;
}
type=parser.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
private void request_Data() {
// TODO Auto-generated method stub
HttpUtils utils = new HttpUtils();
// 超時時間
utils.configCurrentHttpCacheExpiry(5000);
// get請求方式 請求地址url 回調接口
String myPath = path + "?uid=0&pageIndex=" + index + "&pageSize=20";
utils.send(HttpMethod.GET,
myPath,
new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
// TODO Auto-generated method stub
// 請求數據失敗
}
@Override
public void onSuccess(ResponseInfo<String> arg0) {
reultData = arg0.result;
arrayInputStream = new ByteArrayInputStream(
reultData.getBytes());
// 解析數據xml
handler.sendEmptyMessage(1);
}
});
}
private void onLoad() {
// lv.addHeaderView(lv, data, false);
xlistview.stopRefresh();
xlistview.stopLoadMore();
xlistview.setRefreshTime("剛剛");
}
@Override
public void onRefresh() {
// TODO Auto-generated method stub
//刷新的時候 下標還是顯示一
index=0;
isRefresh=true;
//重新請求數據
request_Data();
}
@Override
public void onLoadMore() {
// TODO Auto-generated method stub
index++;
isRefresh=false;
//重新請求數據
request_Data();
}
}
-------------------------Reason---------------------//bean類 //作爲解析數據的封裝類
public class Reason {
private String portrait;//頭像
private String body;//內容
private String imgSmall;//圖片內容
private String name;
public String getPortrait() {
return portrait;
}
public void setPortrait(String portrait) {
this.portrait = portrait;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getImgSmall() {
return imgSmall;
}
public void setImgSmall(String imgSmall) {
this.imgSmall = imgSmall;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Reason [portrait=" + portrait + ", body=" + body
+ ", imgSmall=" + imgSmall + ", name=" + name + "]";
}
}
--------------------MyListAdapter--------------------//適配器
import java.util.List;
import com.hao.bean.MyView;
import com.hao.bean.Reason;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import android.content.Context;
import android.graphics.Bitmap.Config;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyListAdapter extends BaseAdapter {
private Context context;
private List<Reason> list;
//圖片配置
private DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Config.RGB_565)
.build();
private DisplayImageOptions options1 = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.displayer(new MyView(1))//調用上方方法
.bitmapConfig(Config.RGB_565)
.build();
public MyListAdapter(Context context, List<Reason> list) {
super();
this.context = context;
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
private ViewHolder holder;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
holder = new ViewHolder();
if(convertView==null){
convertView=View.inflate(context, R.layout.list_item, null);
holder.item_news_iv=(ImageView) convertView.findViewById(R.id.item_news_iv);
holder.item_toux=(ImageView) convertView.findViewById(R.id.item_toux);
holder.item_nicheng=(TextView) convertView.findViewById(R.id.item_nicheng);
holder.item_title=(TextView) convertView.findViewById(R.id.item_title);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
if(holder.item_nicheng.equals("")){
holder.item_nicheng.setText("這傢伙沒有暱稱");
}else{
holder.item_nicheng.setText(list.get(position).getName());
}
holder.item_title.setText(list.get(position).getBody());
if(list.get(position).getImgSmall().equals("")){
holder.item_news_iv.setImageResource(R.drawable.ic_launcher);
}else{
ImageLoader.getInstance().displayImage(list.get(position).getImgSmall(), holder.item_news_iv, options);
}
ImageLoader.getInstance().displayImage(list.get(position).getPortrait(), holder.item_toux, options1);
}
return convertView;
}
class ViewHolder{
ImageView item_news_iv,item_toux;
TextView item_nicheng,item_title;
}
}
-------------------------MyAppLication---------------------配置IMageLoader
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import android.app.Application;
public class MyLication extends Application{
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
// 創建默認的ImageLoader配置參數
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(
this).writeDebugLogs() // 打印log信息
.build();
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(configuration);
}
}
------------------------MyView-------------------------//畫圓 頭像作爲圓形圖片顯示
作爲全局 ImageLoader加載時使用
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import com.nostra13.universalimageloader.core.assist.LoadedFrom;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
public class MyView extends RoundedBitmapDisplayer{
public MyView(int cornerRadiusPixels) {
super(cornerRadiusPixels);
// TODO Auto-generated constructor stub
}
@Override
public void display(Bitmap bitmap, ImageAware imageAware,
LoadedFrom loadedFrom) {
imageAware.setImageDrawable(new CircleDrawable(bitmap, margin));
}
public static class CircleDrawable extends Drawable {
private final int margin;
private final RectF mRect = new RectF();
private final BitmapShader bitmapShader;
private final Paint paint;
private RectF mBitmapRect;
public CircleDrawable(Bitmap bitmap, int margin) {
this.margin = 0;
// 創建着色器
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,
Shader.TileMode.CLAMP);
mBitmapRect = new RectF(margin, margin, bitmap.getWidth() - margin,
bitmap.getHeight() - margin);
// 設置畫筆
paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(bitmapShader);
}
// 畫圓,覆蓋原來的位圖
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
mRect.set(margin, margin, bounds.width() - margin, bounds.height()
- margin);
// 調整位圖,設置該矩陣,轉換映射源矩形和目的矩形
Matrix shaderMatrix = new Matrix();
shaderMatrix.setRectToRect(mBitmapRect, mRect,
Matrix.ScaleToFit.FILL);
// 設置着色器矩陣
bitmapShader.setLocalMatrix(shaderMatrix);
}
// 畫出其邊界(通過設置的setBounds)
@Override
public void draw(Canvas canvas) {
canvas.drawRoundRect(mRect, mRect.width()/2 , mRect.height()/2,
paint);
}
/**
* 返回此繪製對象的不透明度/透明度 ,返回的值是抽象的格式常數的PixelFormat之一:未知,半透明,透明或不透明
* */
@Override
public int getOpacity() {
// 半透明
return PixelFormat.TRANSLUCENT;
}
// 設置透明度
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
// 彩色濾光片(通過設置setColorFilter)
@Override
public void setColorFilter(ColorFilter cf) {
paint.setColorFilter(cf);
}
}
}
最後別忘了加聯網權限和配置application,這裏一個請求帶xml解析與優化展示 刷新就完成了 ,
-----------------------------僅供參考-----------------------