查询快递中,快递公司数据信息的问题

我将快递公司的相关信息,直接放在了res/raw/companyinfos.json,文件里面,然后在应用启动的时候先创建数据库,然后在选择快递公司画面的时候就读取信息。目前信息不多,但是如果信息再增加的话,会出现进入选择快递公司画面的时候数据加载缓慢,空顿的现象。因此我本来想把所有操作放在MyApplication.java中。


创建数据库

/**
	 * 加载数据流程:第一次安装该应用的时候,就创建数据库 并且解析数据插入数据库
	 * 
	 * 
	 * SD卡 创建数据库目录
	 * 
	 * @throws Exception
	 */
	public static void loadDatabase(Context context) throws Exception {
		// 第一次运行应用程序时,加载数据库到data/data/当前包的名称/database/<db_name>
		File dir = new File("data/data/" + context.getPackageName()
				+ "/databases");

		if (!dir.exists() || !dir.isDirectory()) {
			dir.mkdir();
		}
		File file = new File(dir, "mypackage");
		// file.delete() ;
		if (!file.exists()) {
			// 获得封装.db文件的InputStream对象
			InputStream is = context.getResources().openRawResource(
					R.raw.mypackage);
			FileOutputStream fos = new FileOutputStream("data/data/"
					+ context.getPackageName() + "/databases/mypackage");
			byte[] buffer = new byte[7168];
			int count = 0;
			// 开始复制.db文件
			while ((count = is.read(buffer)) > 0) {
				fos.write(buffer, 0, count);
			}
			fos.close();
			is.close();

		}
	}

读取数据到数据库

/**
	 * 解析json数据插入数据库
	 * 
	 * @param context
	 * 
	 */
	public static void readData2Db(Context context) {

		InputStream in = context.getResources().openRawResource(R.raw.companyinfos);
		try {
			// 将in读入reader 中
			BufferedReader br = new BufferedReader(new InputStreamReader(in,
					"GBK"));
			StringBuffer buffer = new StringBuffer("");
			String tem = "";
			while ((tem = br.readLine()) != null) {
				buffer.append(tem);
			}
			br.close();
			JSONObject myjson = new JSONObject(buffer.toString());
			JSONArray jsonarr = myjson.getJSONArray("companyinfos");
			cls_companyinfo companyinfo = new cls_companyinfo();
			for (int i = 0; i < jsonarr.length(); i++) {
				JSONObject njson = jsonarr.getJSONObject(i);
				String compName = njson.getString("name");
				String compId = njson.getString("id");
				String helpinfo = njson.getString("helpinfo");
				String phoneNumber = njson.getString("phonenumber");
				companyinfo.info_cd = companyinfo.getMaxIndexNo(Common.dbh);
				companyinfo.name = compName;
				companyinfo.id = compId;
				companyinfo.count = "0";
				companyinfo.helpInfo = helpinfo;
				companyinfo.phoneNumber = phoneNumber;
				companyinfo.addData(Common.dbh);
			}

			Common.writeConfig(context, Common.HASLOAD_DATABASE, "1");// 加载数据库完成,写入成功标志位
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}

	}

数据:

companyinfos.json

{
	"companyinfos":[
	{"name":"EMS","id":"ems","helpinfo":"","phonenumber":"查询电话:11183"},
	{"name":"申通快递","id":"shentong","helpinfo":"申通单号由12位数字组成,常见以268*、368*、58*等开头","phonenumber":"400-889-5543"},
	{"name":"邮政包裹","id":"youzhengguonei","helpinfo":"","phonenumber":"11185"},
	{"name":"圆通速递","id":"yuantong","helpinfo":"圆通单号由10位字母数字组成,常见以6*、8*及V*等开头","phonenumber":"021-69777888"},
	{"name":"顺丰速运","id":"shunfeng","helpinfo":"顺丰单号由12位数字组成,常以电话区号后3位开头","phonenumber":"4008-111-111"},
	{"name":"中通速递","id":"zhongtong","helpinfo":"中通单号由12位数字组成,常见以2008**、6**、010等开头","phonenumber":"400-827-0270"},
	{"name":"韵达快递","id":"yunda","helpinfo":"","phonenumber":"400-821-6789"},
	{"name":"宅急送","id":"zhaijisong","helpinfo":"","phonenumber":"400-6789-000"},
	{"name":"天天快递","id":"tiantian","helpinfo":"","phonenumber":"400-188-8888"},
	{"name":"中邮物流","id":"zhongyouwuliu","helpinfo":"一般是以A或E开头,字母+数字组成,查询时CNPL无需输入","phonenumber":"11183"},
	{"name":"AAE-中国件","id":"aae","helpinfo":"","phonenumber":""},
	{"name":"安信达","id":"anxindakuaixi","helpinfo":"","phonenumber":""},
	{"name":"BHT","id":"bht","helpinfo":"","phonenumber":""},
	{"name":"百福东方","id":"baifudongfang","helpinfo":"","phonenumber":""},
	{"name":"CCES(国通快递)","id":"cces","helpinfo":"","phonenumber":""},
	{"name":"DHL-中国件","id":"dhl","helpinfo":"","phonenumber":"800-810-8000"},
	{"name":"DPEX","id":"dpex","helpinfo":"","phonenumber":""},
	{"name":"D速快递","id":"dsukuaidi","helpinfo":"","phonenumber":""},
	{"name":"大田物流","id":"datianwuliu","helpinfo":"大田物流单号一般是由以6*开头10位纯数字组成","phonenumber":""},
	{"name":"德邦物流","id":"debangwuliu","helpinfo":"","phonenumber":"400-830-5555"},
	{"name":"FedEx-国际件","id":"fedex","helpinfo":"","phonenumber":"400-886-1888"},
	{"name":"飞康达","id":"feikangda","helpinfo":"","phonenumber":""},
	{"name":"广东邮政","id":"guangdongyouzhengwuliu","helpinfo":"","phonenumber":""},
	{"name":"能达速递","id":"ganzhongnengda","helpinfo":"","phonenumber":"400-620-1111"},
	{"name":"汇通快运","id":"huitongkuaidi","helpinfo":"百世汇通单号由12-14位数字字母组成,常见以50*开头","phonenumber":"400-956-5656"},
	{"name":"天地华宇","id":"tiandihuayu","helpinfo":"","phonenumber":""},
	{"name":"佳怡物流","id":"jiayiwuliu","helpinfo":"","phonenumber":""},
	{"name":"佳吉快运","id":"jiajiwuliu","helpinfo":"","phonenumber":"400-820-5566"},
	{"name":"急先达","id":"jixianda","helpinfo":"","phonenumber":""},
	{"name":"京广速递","id":"jinguangsudikuaijian","helpinfo":"","phonenumber":""},
	{"name":"快捷速递","id":"kuaijiesudi","helpinfo":"","phonenumber":""},
	{"name":"龙邦速递","id":"longbanwuliu","helpinfo":"","phonenumber":""},
	{"name":"联昊通","id":"lianhaowuliu","helpinfo":"","phonenumber":"0769-88620000"},
	{"name":"联邦快递","id":"lianbangkuaidi","helpinfo":"","phonenumber":""},
	{"name":"民航快递","id":"minghangkuaidi","helpinfo":"","phonenumber":""},
	{"name":"全一快递","id":"quanyikuaidi","helpinfo":"","phonenumber":"400-663-1111"},
	{"name":"全晨快递","id":"quanchenkuaidi","helpinfo":"","phonenumber":""},
	{"name":"全日通","id":"quanritongkuaidi","helpinfo":"","phonenumber":""},
	{"name":"全际通","id":"quanjitong","helpinfo":"","phonenumber":""},
	{"name":"盛辉物流","id":"shenghuiwuliu","helpinfo":"","phonenumber":""},
	{"name":"速尔快递","id":"suer","helpinfo":"速尔的快递单号由12位数字组成的","phonenumber":"400-158-9888"},
	{"name":"三态速递","id":"santaisudi","helpinfo":"","phonenumber":""},
	{"name":"TNT","id":"tnt","helpinfo":"","phonenumber":""},
	{"name":"天地华宇","id":"tiandihuayu","helpinfo":"","phonenumber":"400-808-6666"},
	{"name":"UPS","id":"ups","helpinfo":"","phonenumber":""},
	{"name":"万家物流","id":"wanjiawuliu","helpinfo":"","phonenumber":""},
	{"name":"鑫飞鸿","id":"xinhongyukuaidi","helpinfo":"","phonenumber":""},
	{"name":"CCES(国通快递)","id":"cces","helpinfo":"","phonenumber":""},
	{"name":"星晨急便","id":"xingchengjibian","helpinfo":"","phonenumber":""},
	{"name":"新邦物流","id":"xinbangwuliu","helpinfo":"","phonenumber":""},
	{"name":"信丰物流","id":"xinfengwuliu","helpinfo":"","phonenumber":""},
	{"name":"亚风速递","id":"yafengsudi","helpinfo":"","phonenumber":"400-1111-119"},
	{"name":"源伟丰","id":"yuanweifeng","helpinfo":"","phonenumber":""},
	{"name":"优速物流","id":"youshuwuliu","helpinfo":"","phonenumber":""},
	{"name":"运通中港","id":"yuntongkuaid","helpinfo":"","phonenumber":""},
	{"name":"邮政国际","id":"youzhengguoji","helpinfo":"","phonenumber":""},
	{"name":"越丰物流","id":"yuefengwuliu","helpinfo":"","phonenumber":""},
	{"name":"远成物流","id":"yuanchengwuliu","helpinfo":"","phonenumber":""},
	{"name":"中铁快运","id":"zhongtiewuliu","helpinfo":"","phonenumber":"95572"},
	{"name":"中邮物流","id":"zhongyouwuliu","helpinfo":"","phonenumber":""}
	]
}


先看下图:


这个画面参照了一个牛人写的,具体地址:http://blog.csdn.net/xiaanming/article/details/12684155


主类:SelectCompanyActivity

package com.xiangxm.checkpackage;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LayoutAnimationController;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.xiangxm.cls.cls_companyinfo;
import com.xiangxm.myapp.MyApplication;
import com.xiangxm.sortlistview.CharacterParser;
import com.xiangxm.sortlistview.ClearEditText;
import com.xiangxm.sortlistview.PinyinComparator;
import com.xiangxm.sortlistview.SideBar;
import com.xiangxm.sortlistview.SideBar.OnTouchingLetterChangedListener;
import com.xiangxm.sortlistview.SortAdapter;
import com.xiangxm.sortlistview.SortModel;
import com.xiangxm.utils.Common;

/**
 * 选择快递公司
 * @author 
 *
 */
public class SelectCompanyActivity extends Activity implements OnClickListener {
	private ListView sortListView;
	private SideBar sideBar;
	private TextView dialog;
	private SortAdapter adapter;
	private ClearEditText mClearEditText;

	/**
	 * 汉字转换成拼音的类
	 */
	private CharacterParser characterParser;
	private List<SortModel> SourceDateList;

	/**
	 * 根据拼音来排列ListView里面的数据类
	 */
	private PinyinComparator pinyinComparator;

	private Button backBtn;
	private Context mcontext;

	List<cls_companyinfo> companyInfoList = null;

	private itemOnclickCallBack onclickCallBack;
	private MyApplication myApplication;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.selectcompany_layout);

		myApplication = MyApplication.getInstance();
		companyInfoList = new ArrayList<cls_companyinfo>();
		mcontext = this;
		initViews();
	}

	private Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			switch (msg.what) {
			case 0:
				// 刷新UI

				break;
			}
		}
	};

	private void initViews() {
		backBtn = (Button) findViewById(R.id.backBtn);
		backBtn.setOnClickListener(this);
		// 实例化汉字转拼音类
		characterParser = CharacterParser.getInstance();
		pinyinComparator = new PinyinComparator();

		sideBar = (SideBar) findViewById(R.id.sidrbar);
		dialog = (TextView) findViewById(R.id.dialog);
		sideBar.setTextView(dialog);

		// 设置右侧触摸监听
		sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {

			@Override
			public void onTouchingLetterChanged(String s) {

				if (s != null) {
					// 该字母首次出现的位置
					int position = adapter.getPositionForSection(s.charAt(0));
					if (position != -1) {
						sortListView.setSelection(position);
					}
				}
			}
		});

		sortListView = (ListView) findViewById(R.id.country_lvcountry);
		sortListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {

				// 这里要利用adapter.getItem(position)来获取当前position所对应的对象
				Toast.makeText(getApplication(),
						((SortModel) adapter.getItem(position)).getName(),
						Toast.LENGTH_SHORT).show();

				// view.setBackgroundColor(Color.parseColor("#E0EEEE"));
				SortModel model = (SortModel) adapter.getItem(position);

				Bundle bundle = new Bundle();
				bundle.putString("companyName", model.getName());
				bundle.putString("companyId", model.getCompanyId());
				Intent intent = new Intent();
				intent.putExtras(bundle);
				setResult(8, intent);
				overridePendingTransition(R.anim.push_left_out,
						R.anim.push_left_in);
				SelectCompanyActivity.this.finish();
			}
		});

		// 动画效果    
		AnimationSet set = new AnimationSet(true);

		Animation animation = new AlphaAnimation(0.0f, 1.0f);
		animation.setDuration(50);
		set.addAnimation(animation);

		animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
				Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
				-1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
		animation.setDuration(100);
		set.addAnimation(animation);

		LayoutAnimationController controller = new LayoutAnimationController(
				set, 0.5f);
		sortListView.setLayoutAnimation(controller);

		mClearEditText = (ClearEditText) findViewById(R.id.filter_edit);

		// 根据输入框输入值的改变来过滤搜索
		mClearEditText.addTextChangedListener(new TextWatcher() {

			@Override
			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
				// 当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
				filterData(s.toString());
			}

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {

			}

			@Override
			public void afterTextChanged(Editable s) {
			}
		});
		companyInfoList = cls_companyinfo.getCompanyInfoList(Common.dbh);
		// companyInfoList.addAll(myApplication.getCompanyInfoList()) ;
		SourceDateList = filledData(companyInfoList);// 数据源

		// 根据a-z进行排序源数据
		Collections.sort(SourceDateList, pinyinComparator);
		adapter = new SortAdapter(SelectCompanyActivity.this, SourceDateList);
		sortListView.setAdapter(adapter);
		changeBtnBackground();// 修改按钮背景色
	}

	/**
	 * 为ListView填充数据
	 * 
	 * @param date
	 * @return
	 */
	private List<SortModel> filledData(List<cls_companyinfo> list) {
		List<SortModel> mSortList = new ArrayList<SortModel>();

		int size = list.size();
		for (int i = 0; i < size; i++) {
			SortModel sortModel = new SortModel();
			sortModel.setName(list.get(i).name);
			sortModel.setCompanyId(list.get(i).id);
			// 汉字转换成拼音
			String pinyin = characterParser.getSelling(list.get(i).name);
			String sortString = pinyin.substring(0, 1).toUpperCase();

			// 正则表达式,判断首字母是否是英文字母
			if (sortString.matches("[A-Z]")) {
				sortModel.setSortLetters(sortString.toUpperCase());
			} else {
				sortModel.setSortLetters("#");
			}

			mSortList.add(sortModel);
		}
		return mSortList;

	}

	/**
	 * 根据输入框中的值来过滤数据并更新ListView
	 * 
	 * @param filterStr
	 */
	private void filterData(String filterStr) {
		List<SortModel> filterDateList = new ArrayList<SortModel>();

		if (TextUtils.isEmpty(filterStr)) {
			filterDateList = SourceDateList;
		} else {
			filterDateList.clear();
			for (SortModel sortModel : SourceDateList) {
				String name = sortModel.getName();
				if (name.indexOf(filterStr.toString()) != -1
						|| characterParser.getSelling(name).startsWith(
								filterStr.toString())) {
					filterDateList.add(sortModel);
				}
			}
		}

		// 根据a-z进行排序
		Collections.sort(filterDateList, pinyinComparator);
		adapter.updateListView(filterDateList);
	}

	public void setOnclickCallBack(itemOnclickCallBack onclickCallBack) {
		this.onclickCallBack = onclickCallBack;
	}

	/**
	 * 接口用于回调
	 * 
	 * @author 
	 * 
	 */
	public interface itemOnclickCallBack {

		void itemOnClick(HashMap<String, String> map);
	}

	@Override
	public void onClick(View v) {

		if (v.getId() == R.id.backBtn) {// 回退

			this.finish();
			// overridePendingTransition(R.anim.push_left_out,
			// R.anim.push_left_in);

		}

	}

	/**
	 * 修改按钮背景图片
	 */
	public void changeBtnBackground() {

		class MyBtnOnTouch implements OnTouchListener {

			int drawable[] = null;

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				drawable = new int[] { R.drawable.back_button_selected,
						R.drawable.back_button_normal };

				switch (event.getAction()) {

				case MotionEvent.ACTION_DOWN:

					v.setBackgroundResource(drawable[0]);

					break;
				case MotionEvent.ACTION_UP:
					v.setBackgroundResource(drawable[1]);
					break;
				}

				return false;
			}

		}

		backBtn.setOnTouchListener(new MyBtnOnTouch());
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值