我将快递公司的相关信息,直接放在了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());
}
}