仿淘寶收貨地址,本地數據庫
誰說咱們攻城獅不能寫出既幽默又能懂的博客呢,本人想推出一係列博文,可以給剛接觸Android開發的做一個參考,也可以與接觸Android已久的各路大神比較一下,本人喜歡交流,如果有寫得不好的地方,歡迎大家指出.如果有更好的效果或者功能,希望大家多多指點,互相學習可以共同進步.
說了這麼多,現在進入今天的豬蹄,推出<<暴走漫畫係列--高仿淘寶收貨地址>>,有網購經驗的同學應該對這個很熟悉,在淘寶的Android客戶端裏麵,有一個功能是設置收貨地址,不清楚的同學可以自己下載個淘寶客戶端,自己添加一下看看.
本人一向喜歡貼圖,這樣有圖有真相,才能說服每個人,廢話不多說先上自己程序啟動畫麵,然後運行界麵,最後一張是淘寶客戶端對照圖.
圖片震樓
啟動界麵
運行界麵
淘寶界麵
淘寶客戶端無法錄屏所以這裏隻能上靜態的,大家可以自己打開淘寶客戶端看看.
下麵進行詳細的代碼講解:
(一)本人在程序啟動的時候開了一條後台服務landDivideServeice,目的是為了將全國的省市縣總共4,189條數據插入到手機數據庫裏麵去,原本的數據是保存在7個txt裏麵的,由於放在txt裏麵,讀取操作很不方便,所以我把它放到數據庫,在後麵的地區篩選很快就出來,這個比淘寶還快哦,不信你們可以試一下.
這裏要注意的一點是landDivideServeice是繼承IntentService的,不是直接繼承Service的.
IntentService是繼承於Service並處理異步請求的一個類,在IntentService內有一個工作線程來處理耗時操作,啟動IntentService的方式和啟動傳統Service一樣,同時,當任務執行完後,IntentService會自動停止,而不需要我們去手動控製。
簡單的說IntentService類似於一條後台線程,但操作完成時,我們不用手動去關閉Serveice,他會自動關閉.MyIntentService繼承IntentService,之後必須實現一個無參數的構造方法MyIntentService(),然後還要重寫onHandleIntent(Intent intent);此後所有的後台操作即可在onHandleIntent(Intent intent)執行;
- public class MyIntentService extends IntentService {
- //必須實現的
- public MyIntentService() {
- super("MyIntentService");
- // TODO Auto-generated constructor stub
- }
- @Override
- protected void onHandleIntent(Intent arg0) {
- // TODO Auto-generated method stub
- //具體的操作
- }
- }
so
ga...
IntentService詳細解析:
https://blog.csdn.net/ryantang03/article/details/8146154
https://blog.csdn.net/flowingflying/article/details/7616333
(二)在程序啟動的第一個activity裏,我弄了一條倒計時線程,時間總共是20秒,目的是想為數據寫入數據庫爭取多一些時間,如果你進入地址篩選界麵,看到數據不全或者報錯,是因為數據還沒有寫完.
實現倒計時功能主要是繼承CountDownTimer類,重寫onTick和onFinsh這兩個方法,onFinish()中的代碼是計時器結束的時候要做的事情;onTick(Long m)中的代碼是你倒計時開始時要做的事情,構造方法TimeCount()中的兩個參數中,前者是倒計的時間數,後者是倒計每秒中間 的間隔時間,都是以毫秒為單位.例如要倒計時30秒,每秒中間間隔時間是1秒,兩個參數可以這樣寫TimeCount(20000,1000).
- TimeCount time = new TimeCount(20000, 1000);
- time.start();
- /* 定義一個倒計時的內部類 */
- class TimeCount extends CountDownTimer {
- public TimeCount(long millisInFuture, long countDownInterval) {
- super(millisInFuture, countDownInterval);
- }
- @Override
- public void onFinish() { //倒計時執行結束時操作
- next = 0;
- }
- @Override
- public void onTick(long millisUntilFinished) { //倒計執行時操作
- }
- }
(三)剩下的主要是一些界麵的切換跟數據的讀取,隻要思路正確是不會被搞混的.
- landDivideDB = LandDivideDB.getInstance(getBaseContext());
- List<LandDivide> landDivide = landDivideDB.queryAddress("superior=?", new String[]{"1"});
- Iterator<LandDivide> iterator = null;
- if(landDivide!=null){
- iterator = landDivide.iterator();
- while(iterator.hasNext()){
- LandDivide l = iterator.next();
- sheng.add(l.getName());
- }
- }else{
- return;
- }
- mListView1.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int position,
- long arg3) {
- // TODO Auto-generated method stub
- mLinearLayout1.setVisibility(View.GONE);
- mLinearLayout2.setVisibility(View.VISIBLE);
- mLinearLayout3.setVisibility(View.GONE);
- shi.clear();
- String name = sheng.get(position);
- String code = null;
- shengStr = name;
- shengTxt2.setText(name);
- List<LandDivide> landDivide = landDivideDB.queryAddress("name=?", new String[]{name});
- Iterator<LandDivide> iterator= landDivide.iterator();
- while(iterator.hasNext()){
- LandDivide l = iterator.next();
- code = l.getCode();
- break;
- }
- List<LandDivide> landDivide_2 = landDivideDB.queryAddress("superior=?", new String[]{code});
- Iterator<LandDivide> iterator_2= landDivide_2.iterator();
- while(iterator_2.hasNext()){
- LandDivide l = iterator_2.next();
- shi.add(l.getName());
- }
- shiAdapter.notifyDataSetChanged();
- quAdapter.clear();
- quAdapter.notifyDataSetChanged();
- }
- });
- mListView2.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int position,
- long arg3) {
- // TODO Auto-generated method stub
- qu.clear();
- String name = shi.get(position);
- String code = null;
- shiStr = name;
- shengTxt3.setText(shengStr);
- shiTxt3.setText(name);
- List<LandDivide> landDivide = landDivideDB.queryAddress("name=?", new String[]{name});
- Iterator<LandDivide> iterator= landDivide.iterator();
- while(iterator.hasNext()){
- LandDivide l = iterator.next();
- code = l.getCode();
- break;
- }
- List<LandDivide> landDivide_2 = landDivideDB.queryAddress("superior=?", new String[]{code});
- if(landDivide_2!=null){
- Iterator<LandDivide> iterator_2= landDivide_2.iterator();
- while(iterator_2.hasNext()){
- LandDivide l = iterator_2.next();
- qu.add(l.getName());
- }
- }
- quAdapter.notifyDataSetChanged();
- if(qu.size()<1){
- mLinearLayout1.setVisibility(View.GONE);
- mLinearLayout2.setVisibility(View.VISIBLE);
- mLinearLayout3.setVisibility(View.GONE);
- Intent i = new Intent(AddressChoose.this,BuyAddress.class);
- i.putExtra("address", shengStr+","+shiStr);
- startActivity(i);
- finish();
- }else{
- mLinearLayout1.setVisibility(View.GONE);
- mLinearLayout2.setVisibility(View.GONE);
- mLinearLayout3.setVisibility(View.VISIBLE);
- mListView3.setVisibility(View.VISIBLE);
- topView3.setText("請選擇 縣區/其他...");
- }
- }
- });
- mListView3.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int position,
- long arg3) {
- // TODO Auto-generated method stub
- String name = qu.get(position);
- quStr = name;
- Intent i2 = new Intent(AddressChoose.this,BuyAddress.class);
- i2.putExtra("address", shengStr+" "+shiStr+" "+quStr);
- startActivity(i2);
- finish();
- }
- });
(四)這個是選擇好地址之後的界麵,主要還是界麵的轉換跟焦點的獲取
有時候setFocusable(true)跟setFocusableInTouchMode(true)並不能使控件獲得焦點,要再之前加上一句requestFocus(),這樣控件就可以獲得焦點.
- OnFocusChangeListener focusChanger = new OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- // TODO Auto-generated method stub
- myAddress.setStreet(jiequText.getText().toString());
- myAddress.setName(nameText.getText().toString());
- myAddress.setPhone(phoneText.getText().toString());
- switch (v.getId()) {
- case R.id.my_set_buyaddress_jiequ:
- if (!hasFocus && myAddress.getStreet().length() > 0) {
- jiequText.setVisibility(View.GONE);
- jiequLinear.setVisibility(View.VISIBLE);
- jiequTextView.setText(myAddress.getStreet());
- }
- if (hasFocus) {
- jiequText.setSelectAllOnFocus(true);
- }
- break;
- case R.id.my_set_buyaddress_name:
- if (!hasFocus && myAddress.getName().length() > 0) {
- nameText.setVisibility(View.GONE);
- nameLinear.setVisibility(View.VISIBLE);
- nameTextView.setText(myAddress.getName());
- }
- if (hasFocus) {
- nameText.setSelectAllOnFocus(true);
- }
- break;
- case R.id.my_set_buyaddress_phone:
- if (!hasFocus && myAddress.getPhone().length() > 0) {
- phoneText.setVisibility(View.GONE);
- phoneLinear.setVisibility(View.VISIBLE);
- phoneTextView.setText(myAddress.getPhone());
- }
- if (hasFocus) {
- phoneText.setSelectAllOnFocus(true);
- }
- break;
- default:
- break;
- }
- }
- };
- OnClickListener click = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch (v.getId()) {
- case R.id.my_set_buyaddress_sheng_linear:
- Intent i = new Intent(BuyAddress.this, AddressChoose.class);
- i.putExtra("Boolean", "aaa");
- startActivity(i);
- break;
- case R.id.my_set_buyaddress_jiequ_linear:
- jiequText.setVisibility(View.VISIBLE);
- jiequLinear.setVisibility(View.GONE);
- jiequText.setFocusable(true);
- jiequText.setFocusableInTouchMode(true);
- jiequText.requestFocus();
- break;
- case R.id.my_set_buyaddress_name_linear:
- nameText.setVisibility(View.VISIBLE);
- nameLinear.setVisibility(View.GONE);
- nameText.setFocusable(true);
- nameText.setFocusableInTouchMode(true);
- nameText.requestFocus();
- break;
- case R.id.my_set_buyaddress_phone_linear:
- phoneText.setVisibility(View.VISIBLE);
- phoneLinear.setVisibility(View.GONE);
- phoneText.setFocusable(true);
- phoneText.setFocusableInTouchMode(true);
- phoneText.requestFocus();
- break;
- case R.id.my_set_buyaddress_address_btn:
- myAddress.setStreet(jiequText.getText().toString());
- myAddress.setName(nameText.getText().toString());
- myAddress.setPhone(phoneText.getText().toString());
- if (myAddress.getPhone().length() > 0) {
- phoneText.setVisibility(View.GONE);
- phoneLinear.setVisibility(View.VISIBLE);
- phoneTextView.setText(myAddress.getPhone());
- }
- postBtn.requestFocus();
- postBtn.setFocusable(true);
- postBtn.setFocusableInTouchMode(true);
- if (myAddress.getProvinces().length() < 1 || myAddress.getStreet().length() < 1
- || myAddress.getName().length() < 1 || myAddress.getPhone().length() < 1) {
- Toast.makeText(getBaseContext(), "請完整填寫收貨人資料", 0).show();
- return;
- }
- myAddress.setStatus(checkBox.isChecked());
- AddressDB addressDB = AddressDB.getInstance(getBaseContext());
- if(checkBox.isChecked()){
- List<AddressInfo> list = addressDB.queryAddress();
- if(list!=null){
- Iterator<AddressInfo> iterator = list.iterator();
- while(iterator.hasNext()){
- AddressInfo a = iterator.next();
- a.setStatus(false);
- addressDB.updeteAddress(a);
- }
- }
- }
- if (addressinfo != null) {
- if(addressDB.updeteAddress(myAddress)){
- Toast.makeText(getBaseContext(), "修改收貨地址成功", Toast.LENGTH_LONG).show();
- }else{
- Toast.makeText(getBaseContext(), "修改收貨地址失敗", Toast.LENGTH_LONG).show();
- }
- } else {
- SimpleDateFormat format = new SimpleDateFormat(
- "yyyyMMddHHmmss");
- Date date = new Date();
- String id = format.format(date);
- myAddress.setId(id);
- if(addressDB.insertAddress(myAddress)){
- Toast.makeText(getBaseContext(), "添加收貨地址成功", Toast.LENGTH_LONG).show();
- }else{
- Toast.makeText(getBaseContext(), "添加收貨地址失敗", Toast.LENGTH_LONG).show();
- }
- }
- Intent intent = new Intent(BuyAddress.this, PersonAddress.class);
- startActivity(intent);
- finish();
- break;
- case R.id.download_layout1:
- finish();
- break;
- default:
- break;
- }
- }
- };





小弟不才,參加了CSDN的博客大賽,在這裏想請各位幫個忙,投下您尊貴的一票,您說都看到這裏了,是不是,底下就是投票的位置了,就順便投一下嘛(如果底下沒有投一票的按鈕,請點擊下麵的鏈接,進入投票頁麵,拉到頁麵底下即可投票).
投票地址:https://vote.blog.csdn.net/Article/Details?articleid=32936187
源碼地址: https://download.csdn.net/detail/chillax_li/7531409
最後更新:2017-04-03 07:57:14
上一篇:
員工(人才),留得住是因為本身就留得住;留不住的,你永遠留不住 .
下一篇:
android的activity棧管理
java 在線編輯模版 代碼編輯器 兼容手機平板PC freemaker 靜態引擎 網站源碼
Linux shell 基礎之Vim編輯器
前端ThinkJS框架解析
轉型技術管理?Yes or No
常見的java基礎麵試題匯總-01
MySQL錯誤(org.hibernate.MappingException: No Dialect mapping for JDBC type: -4) 解決方案
[usaco]4.2.2偶圖匹配 The Perfect Stall
Django 博客開發教程 12 - 評論
Ora-00911:無效字符
最新VMware Workstation 9.0 / Player 5.0 / Fusion 5.0/VMware Tools 9.2.0 不同平台正式版下載