pull解析请求网络的数据(带分页加载,刷新)


在请求下的数据中,其中不免有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解析与优化展示  刷新就完成了 ,
                                                                                                              -----------------------------仅供参考----------------------- 
                                                                                                                                        转载请注明出处:点击打开链接






  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值