Android万能的Adapter

Posted on Leave a commentPosted in Android

啊哈,今天来分享一个万能AndroidAdapter,想提高工作效率,和懒的程序猿同胞们有福了,嘻嘻。
代码很简单就不做解释了 直接上代码
先来个CommonAdapter继承BaseAdapter


package org.shuaibi.androidexplore.utils;

import java.util.List;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

/**
*
* @描述: CommonAdapter
* @作者: ZeroX
* @时间: 2015-8-30
* @参数:
* @接口:
*
*/
public abstract class CommonAdapter<T> extends BaseAdapter {

protected List<T> mList;
protected Context mContext;
protected RequestQueue mQueue;
protected ImageLoader mImageLoader;

public CommonAdapter(){

}
public CommonAdapter(List<T> list,Context context)
{
this.mList=list;
this.mContext=context;
this.mQueue = Volley.newRequestQueue(context);
this.mImageLoader = new ImageLoader(mQueue, new BitmapCache());
}

@Override
public int getCount() {

return mList.size();
}

@Override
public Object getItem(int position) {
return mList.get(position);
}

@Override
public long getItemId(int position) {

return position;
}

@Override
public abstract View getView(int position, View convertView, ViewGroup parent);

}

&nbsp;

&nbsp;

 

然后是ViewHolder 这是重点

 


package org.shuaibi.androidexplore.utils;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
*
* @描述: ViewHolder
* @作者: ZeroX
* @时间: 2015-8-30
* @参数:
* @接口:
*
*/
public class ViewHolder {

private SparseArray<View> mView;
private View mConvertView;
public int mPosition;

public ViewHolder(Context context,ViewGroup parent,int position,int layoutId)
{
mView=new SparseArray<View>();
mPosition=position;
mConvertView=LayoutInflater.from(context).inflate(layoutId, parent,false);
mConvertView.setTag(this);
}

public    ViewHolder ()
{

}
public static ViewHolder get(Context context,View convertView,ViewGroup parent,int position,int layoutId)
{
if(convertView==null)
{
return new ViewHolder(context, parent, position, layoutId);
}else {
ViewHolder viewHolder=(ViewHolder) convertView.getTag();
viewHolder.mPosition=position;
return viewHolder;
}

}

@SuppressWarnings("unchecked")
public<T extends View> T getView(int viewId)
{
View view=mView.get(viewId);
if(view==null)
{
view=mConvertView.findViewById(viewId);
mView.put(viewId, view);
}
return (T) view;

}

public View getConvertView()
{
return mConvertView;
}

}

下面是使用方法


package org.shuaibi.androidexplore.adapter;

import java.util.HashMap;
import java.util.List;

import org.shuaibi.androidexplore.R;
import org.shuaibi.androidexplore.config.Config;
import org.shuaibi.androidexplore.utils.CommonAdapter;
import org.shuaibi.androidexplore.utils.ViewHolder;
import com.android.volley.toolbox.NetworkImageView;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
*
* @描述: 产品列表适配器
* @作者: ZeroX
* @时间: 2015-8-30
* @参数:
* @接口:
*
*/
public class ProductListAdapter extends CommonAdapter<HashMap<String, String>> {

public ProductListAdapter(List<HashMap<String, String>> list,Context context)
{
super(list,context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder=ViewHolder.get(mContext, convertView, parent, position,R.layout.item_main);

HashMap<String, String> dataHashMap=(HashMap<String, String>) mList.get(position);
((TextView)holder.getView(R.id.main_tv_productName)).setText(dataHashMap.get("ProductName"));
((NetworkImageView)holder.getView(R.id.main_iv_productimg)).setImageUrl(Config.FILE_ADDRESS+dataHashMap.get("ImageUrl"),mImageLoader);

return holder.getConvertView();
}

}

看是不是比以前少写了很多代码。有不明白的地方 可以去这里看视频

 

 

Android通过Soap请求Webservice共通

Posted on Leave a commentPosted in Android

好久都没写了,今天总结的是Android中通过Soap协议访问Webservice共通类。
首先下载一个第三方jar包k2soap-android-timeout.jar 将下载的文件 放到libs 文件夹下。
实现思路
新建一个接口ServiceCallBack用来传递数据

package org.shuaibi.exploration.utils;

import org.json.JSONObject;

/**
 *
 * @author ZeroX
 *
 */
public interface ServiceCallBack {
	/**
	 * 接口返回值
	 * @param jsonObject 返回的json
	 * @param mark 调用接口时传的标识
	 */
	public void ServiceResult(JSONObject jsonObject,int mark);
}

新建CallWebservice类继承Thread 在线程里面请求网络,然后后将返回的数据发给主线程,最后通过ServiceCallBack发送给Activity ,再在Activity 里处理返回的数据 废话不多说 直接上代码

package org.shuaibi.exploration.utils;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;
import org.json.JSONObject;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;


import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.widget.Toast;



@SuppressLint("HandlerLeak")
public class CallWebServiceBySoap extends Thread{
	private String method,httphost;
	private HashMap<String, String> params;
	private Context context;
	private ServiceCallBack serviceCallBack;
	private int mark;

	/**
	 * Activity访问WebService
	 * @param context 上下文 一定要传 this
	 * @param method 方法名称
	 * @param params 参数名称 
	 * @param serviceName service名
	 * @param mark 标记
	 */
	public CallWebServiceBySoap(Context context,String method, HashMap<String, String> params, String httpHost,int mark)
	{
		this.method=method;
		this.params=params;
		this.httphost=httpHost;
		this.context=context;
		this.serviceCallBack=(ServiceCallBack) context;
		this.mark=mark;
	}

	/**
	 * Fragment访问WebService
	 * @param context 上下文 一定要传 this
	 * @param method 方法名称
	 * @param params 参数名称 
	 * @param serviceName service名
	 * @param mark 标记
	 */
	public CallWebServiceBySoap(Fragment fragment,String method, HashMap<String, String> params, String httpHost,int mark)
	{
		this.method=method;
		this.params=params;
		this.httphost=httpHost;
		this.context=fragment.getActivity();
		this.serviceCallBack=(ServiceCallBack) fragment;
		this.mark=mark;
	}

	@Override
	public void run() {
		super.run();
		Message message=new Message();
		try {
			message.what=1;

			message.obj=getJSONObject(method,params,httphost);
		}catch(ConnectTimeoutException e){
			message.what=-5;
			e.printStackTrace();

		}catch (IOException e) {
			message.what=-5;

			e.printStackTrace();
		}catch (XmlPullParserException e) {

			message.what=-6;
			e.printStackTrace();
		} catch (JSONException e) {

			message.what=-7;
			e.printStackTrace();
		}
		resuleHandler.sendMessage(message);
	}


	Handler resuleHandler=new Handler()
	{
		public void handleMessage(android.os.Message msg) {
			try {

				switch(msg.what)
				{
				case 1:
					int result=((JSONObject)msg.obj).getInt("result");
					switch(result){
					case 1: //状态为1将数据 发到Activity处理
						serviceCallBack.ServiceResult((JSONObject)msg.obj, mark);
						break;
					default ://其他状态 弹出提示信息
						Toast.makeText(context,((JSONObject)msg.obj).getString("msg"), Toast.LENGTH_SHORT).show();
						break;
					}

					break;
				case -5:
					if(Config.NETWORKNUM==0){
						Config.NETWORKNUM++;
						Toast.makeText(context,"连接服务器失败,请检查网络!", Toast.LENGTH_SHORT).show();
					}
					break;
				case -6:
					if(Config.NETWORKNUM==0){
						Config.NETWORKNUM++;
						Toast.makeText(context,"数据解析异常,请稍后再试!", Toast.LENGTH_SHORT).show();
					}
					break;
				case -7: 
					if(Config.NETWORKNUM==0){
						Config.NETWORKNUM++;
						Toast.makeText(context,"返回数据异常!", Toast.LENGTH_SHORT).show();
					}
					break;
				default:

					if(Config.NETWORKNUM==0){
						Config.NETWORKNUM++;
						Toast.makeText(context, "连接服务器失败,请检查网络", Toast.LENGTH_SHORT).show();
					}
					break;
				}
			} catch (JSONException e) {
				Toast.makeText(context, "数据处理异常,请稍后再试", Toast.LENGTH_SHORT).show();
				e.printStackTrace();
			}
		};
	};

	public static JSONObject getJSONObject(String method, HashMap<String, String> params, String httphost) throws IOException, XmlPullParserException, JSONException  {
		String wsdlURL = "http://" + Config.WEBSERVICE_IP + httphost;
		String webMethod = method;
		String namespace = Config.NAME_SPACE;
		String soapAction = namespace + webMethod;
		// 步骤2 创建一个SoapObject对象
		SoapObject soapObject = new SoapObject(namespace, webMethod);
		if(params!=null){
			// 步骤3 传递参数
			Iterator<Entry<String, String>> iterator = params.entrySet().iterator();
			// 循环读取 传递参数
			while (iterator.hasNext()) {
				Entry<String, String> obj = (Entry<String, String>) iterator.next();
				// 将参数添加到SoapObject对象中
				soapObject.addProperty(obj.getKey().toString(), obj.getValue().toString());
			}
		}
		// 步骤4 创建SoapSerializationEnvelope
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
		envelope.dotNet = true;
		// 步骤5 设置一下传回对象
		envelope.bodyOut = soapObject;
		envelope.setOutputSoapObject(soapObject);
		// 步骤6 创建HttpTransportSE用于传输对象
		HttpTransportSE se = new HttpTransportSE(wsdlURL, 1000 * 10);
		JSONObject jsonObject = null;
		se.call(soapAction, envelope);
		// 步骤8获取从webService返回的结果
		if (envelope.getResponse() != null) {
			jsonObject = new JSONObject(envelope.getResponse().toString());
			Config.NETWORKNUM=0;
		}
		return jsonObject;
	}



}

 

使用方法


package org.shuaibi.exploration.activity;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;
import org.json.JSONObject;
import org.shuaibi.exploration.R;
import org.shuaibi.exploration.utils.CallWebServiceByPost;
import org.shuaibi.exploration.utils.ServiceCallBack;

import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
/**
 *
 * @author ZeroX
 *
 */
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity implements ServiceCallBack {

	private final int GETIMG=1;
	private int num=10;

	@ViewById(R.id.tv_result)
	public TextView tv_result;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@AfterViews
	public void initData()
	{
		//请求WebService
		new CallWebServiceByPost(this, "meinv?num="+num, null, GETIMG).start();
	}

	@Override
	public void ServiceResult(JSONObject jsonObject, int mark) {
		switch (mark) {
		case GETIMG:
			//处理接口返回值
			tv_result.setText(jsonObject.toString());
			break;

		default:
			break;
		}

	}

}

AndroidAnnotaions框架使用

Posted on Leave a commentPosted in Android
转眼干Android 也有一些日子了。平时在工作中findViewById和setOnClickListener像这些都是经常写的。一个项目下来,这样的语句会写一大堆。感觉这样的语句写多少遍都不会有什么高。那么问题来了,我们可不可以不写这写语句,答案是坑定的,当然可以。
现在就来介绍我们今天的主角AndroidAnnotaions,这个框架是一个开源框架,大家可以以在GitHub上找到它,这次我们只讨论怎么使用 ,所以就直接下载jar 包 来用。

解压文件能看见两个jar 包

androidannotations-api-3.2.jar
androidannotations-3.2.jar
把androidannotations-api-3.2.jar放到libs 文件夹下
然后在项目中新建一个 文件夹 compile-lib 把下载的androidannotations-3.2.jar放到该文件夹下
右键项目 Build Path -> Configur Build Path ->Java Compiler -> Annotation Processin -> Enable projecr specific settings 打上对号 -> Factory Path ->Add Jars 找到放到 compile-lib 里面的 androidannotations-3.2.jar -> apply
完成上面配置后现在就来 开始使用吧
package org.shuaibi.androidannotions;

import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

import com.example.androidannotions.R;

import android.os.Bundle;
import android.app.Activity;
import android.widget.Button;
import android.widget.TextView;

@EActivity(R.layout.activity_main) //设置页面视图
public class MainActivity extends Activity {

@ViewById(R.id.btn_main_clickme)  //找id为btn_main_clickme的Button 相当于findViewById
Button mClickMe;
@ViewById(R.id.tv_main_helloword)
TextView mHelloWord;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Click(R.id.btn_main_clickme) //给id为btn_main_clickme的Button 设置点击事件
void myButton()
{
mHelloWord.setText("点了我一下");

}

}
上面代码只是简单介绍了AndroidAnnotations 的基本用法。更多用法请参见官方文档

Asp.Net Mvc 使用WebUploader 多图片上传

Posted on Leave a commentPosted in ASP.NET

最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是一次只能传一张。由于现在 项目用的是MVC,像Asp那样 拖控件 是不现实了。在我脑海中立刻就浮现出一个想法,网上一定有插件,哈哈。去网上一搜索,哇哦这么多。在众多的插件中我被百度的WebUploader吸引了。官网上写着:”WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件…”;就是这句里面的”简单”和”现代” 这两个词深深的吸引了我,当然官网提供的Demo也很酷,而且还是开源的,哇咔咔。既然决定用这个了,我就下了一份源代码下来。打开一看,什么gui ,居然是php的。当时的心情你们能理解么?于是我就抱着试一试的心态搜索了一下 “webuploader asp.net” 哈哈居然搜到到Demo了.Demo 是从 eflay 这位前辈的博客上看的。我借用了他的后台方法,由于前面js写的太复杂我没敢用。好了不扯废话了下面就来演示根据WebUploader官方提供的API和前面说的那位前辈的后台方法完成图片上传。

1. 下载WebUploader

2. 将下载到的压缩包里面的文件复制到自己的项目中

3. 添加引用

1 <!--引入Jquery-->
2 <script src="~/Script/jquery-1.8.2.min.js"></script>
3 <!--引入Css-->
4 <link href="~/CSS/webuploader.css" rel="stylesheet" />
5 <!--引入Js-->
6 <script src="~/Script/webuploader.js"></script>

4.准备一个放图片的容器和一个上传按钮

<div id="fileList"></div> <!--这是存放图片的容器-->
<div class="cp_img_jia" id="filePicker"></div> <!--这是上传按钮-->

5.创建Web Uploader实例并监听事件

复制代码

  1 <script type="text/javascript">
  2 
  3     var applicationPath = window.applicationPath === "" ? "" : window.applicationPath || "../../";
  4     $(function () {
  5         var $ = jQuery,
  6         $list = $('#fileList'),
  7         // 优化retina, 在retina下这个值是2
  8         ratio = window.devicePixelRatio || 1,
  9         // 缩略图大小
 10         thumbnailWidth = 90 * ratio,
 11         thumbnailHeight = 90 * ratio,
 12         // Web Uploader实例
 13         uploader;
 14         uploader = WebUploader.create({
 15             // 选完文件后,是否自动上传。
 16             auto: false,
 17 
 18             // swf文件路径
 19             swf: applicationPath + '/Script/Uploader.swf',
 20 
 21             // 文件接收服务端。
 22             server: applicationPath + '/Home/UpLoadProcess',
 23 
 24             // 选择文件的按钮。可选。
 25             // 内部根据当前运行是创建,可能是input元素,也可能是flash.
 26             pick: '#filePicker',
 27 
 28             //只允许选择图片
 29             accept: {
 30                 title: 'Images',
 31                 extensions: 'gif,jpg,jpeg,bmp,png',
 32                 mimeTypes: 'image/*'
 33             }
 34         });
 35        
 36         // 当有文件添加进来的时候
 37         uploader.on('fileQueued', function (file) {
 38             var $li = $(
 39                     '<div id="' + file.id + '" class="cp_img">' +
 40                         '<img>' +
 41                     '<div class="cp_img_jian"></div></div>'
 42                     ),
 43                 $img = $li.find('img');
 44 
 45 
 46             // $list为容器jQuery实例
 47             $list.append($li);
 48 
 49             // 创建缩略图
 50             // 如果为非图片文件,可以不用调用此方法。
 51             // thumbnailWidth x thumbnailHeight 为 100 x 100
 52             uploader.makeThumb(file, function (error, src) {
 53                 if (error) {
 54                     $img.replaceWith('<span>不能预览</span>');
 55                     return;
 56                 }
 57 
 58                 $img.attr('src', src);
 59             }, thumbnailWidth, thumbnailHeight);
 60         });
 61 
 62         // 文件上传过程中创建进度条实时显示。
 63         uploader.on('uploadProgress', function (file, percentage) {
 64             var $li = $('#' + file.id),
 65                 $percent = $li.find('.progress span');
 66 
 67             // 避免重复创建
 68             if (!$percent.length) {
 69                 $percent = $('<p class="progress"><span></span></p>')
 70                         .appendTo($li)
 71                         .find('span');
 72             }
 73 
 74             $percent.css('width', percentage * 100 + '%');
 75         });
 76 
 77         // 文件上传成功,给item添加成功class, 用样式标记上传成功。
 78         uploader.on('uploadSuccess', function (file, response) {
 79             
 80             $('#' + file.id).addClass('upload-state-done');
 81         });
 82 
 83         // 文件上传失败,显示上传出错。
 84         uploader.on('uploadError', function (file) {
 85             var $li = $('#' + file.id),
 86                 $error = $li.find('div.error');
 87 
 88             // 避免重复创建
 89             if (!$error.length) {
 90                 $error = $('<div class="error"></div>').appendTo($li);
 91             }
 92 
 93             $error.text('上传失败');
 94         });
 95 
 96         // 完成上传完了,成功或者失败,先删除进度条。
 97         uploader.on('uploadComplete', function (file) {
 98             $('#' + file.id).find('.progress').remove();
 99         });
100 
101         //所有文件上传完毕
102         uploader.on("uploadFinished", function ()
103         {
104            //提交表单
105 
106         });
107 
108         //开始上传
109         $("#ctlBtn").click(function () {
110             uploader.upload();
111 
112         });
113 
114         //显示删除按钮
115         $(".cp_img").live("mouseover", function ()
116         {
117             $(this).children(".cp_img_jian").css('display', 'block');
118 
119         });
120         //隐藏删除按钮
121         $(".cp_img").live("mouseout", function () {
122             $(this).children(".cp_img_jian").css('display', 'none');
123 
124         });
125         //执行删除方法
126         $list.on("click", ".cp_img_jian", function ()
127         {
128             var Id = $(this).parent().attr("id");
129             uploader.removeFile(uploader.getFile(Id,true));
130             $(this).parent().remove();
131         });
132       
133     });
134 
135 
136 </script>

复制代码

6 在Controller里新建一个Action用于保存图片并返回图片路径(这方法是 eflay 前辈博客上说的)

复制代码

 1  public ActionResult UpLoadProcess(string id, string name, string type, string lastModifiedDate, int size, HttpPostedFileBase file)
 2         {
 3             string filePathName = string.Empty;
 4 
 5             string localPath = Path.Combine(HttpRuntime.AppDomainAppPath, "Upload");
 6             if (Request.Files.Count == 0)
 7             {
 8                 return Json(new { jsonrpc = 2.0, error = new { code = 102, message = "保存失败" }, id = "id" });
 9             }
10 
11             string ex = Path.GetExtension(file.FileName);
12             filePathName = Guid.NewGuid().ToString("N") + ex;
13             if (!System.IO.Directory.Exists(localPath))
14             {
15                 System.IO.Directory.CreateDirectory(localPath);
16             }
17             file.SaveAs(Path.Combine(localPath, filePathName));
18 
19             return Json(new
20             {
21                 jsonrpc = "2.0",
22                 id = id,
23                 filePath = "/Upload/" + filePathName
24             });
25         
26         }

复制代码

这样就大功告成了。由于是第一次写博客,里面如果有写的不详细或不对的地方,欢迎大家指点。希望能和大家一起进步。

Demo下载地址http://pan.baidu.com/s/1hqqvB0o