您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何在Android中使用WheelView實(shí)現(xiàn)三級(jí)聯(lián)動(dòng),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
popupwindow中是三個(gè)wheelview,
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#00000000" android:gravity="bottom" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/ly_myinfo_changeaddress_child" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="#ffffff" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="44dp" > <View android:background="@color/silver" android:layout_width="match_parent" android:layout_height="0.5dp" /> <TextView android:id="@+id/btn_myinfo_cancel" android:layout_width="wrap_content" android:layout_height="match_parent" android:paddingLeft="18dp" android:text="取消" android:gravity="center" android:layout_alignParentLeft="true" android:layout_marginRight="15dip" android:textColor="#e84515" android:textSize="14sp" /> <TextView android:id="@+id/btn_myinfo_sure" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:gravity="center" android:text="完成" android:textColor="#e84515" android:paddingRight="18dp" android:textSize="14sp" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#d8d8d8"/> <LinearLayout android:layout_width="match_parent" android:layout_height="190dip" android:orientation="horizontal" android:gravity="center_vertical"> <guozhaohui.com.wlylocationchoose.locationchoose.WheelView android:id="@+id/provinceView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> <guozhaohui.com.wlylocationchoose.locationchoose.WheelView android:id="@+id/cityView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> <guozhaohui.com.wlylocationchoose.locationchoose.WheelView android:id="@+id/districtView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> </LinearLayout> </LinearLayout> </LinearLayout>
b. 因?yàn)樯厦嬲f了,需要將文件copy到app目錄下,所以直接最好這代碼在application中寫,
package guozhaohui.com.wlylocationchoose; import android.app.Application; import java.io.InputStream; import guozhaohui.com.wlylocationchoose.locationchoose.CityDataHelper; /** * Created by ${GuoZhaoHui} on 2017/2/13. * Abstract: */ public class MyApplication extends Application { private CityDataHelper dataHelper; @Override public void onCreate() { super.onCreate(); /** * 放在application中,讓app一啟動(dòng)就把raw中文件copy到 "/data/data/"+context.getPackageName()+"/databases/" * 這是app讀取數(shù)據(jù)的方法,不管是將數(shù)據(jù)庫(kù)文件放在raw或者assets中都是一樣 */ dataHelper=CityDataHelper.getInstance(this); InputStream in = this.getResources().openRawResource(R.raw.city); dataHelper.copyFile(in,CityDataHelper.DATABASE_NAME,CityDataHelper.DATABASES_DIR); } }
c. popupwindow不是本次的重點(diǎn)也直接貼代碼。
View popupView = LayoutInflater.from(this).inflate(R.layout.popup_locationchoose, null); mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); mPopupWindow.setTouchable(true); mPopupWindow.setFocusable(true); mPopupWindow.setOutsideTouchable(true); mPopupWindow.setAnimationStyle(R.style.popup_locationchoose_bottom); // pickText = (TextView)popupView.findViewById(R.id.tv_pickText); provinceView = (WheelView)popupView.findViewById(R.id.provinceView); cityView = (WheelView)popupView.findViewById(R.id.cityView); districtView = (WheelView)popupView.findViewById(R.id.districtView); //確定或者取消 btn_myinfo_sure = (TextView)popupView.findViewById(R.id.btn_myinfo_sure); btn_myinfo_cancel = (TextView) popupView.findViewById(R.id.btn_myinfo_cancel); btn_myinfo_cancel.setOnClickListener(this); btn_myinfo_sure.setOnClickListener(this);
設(shè)置三個(gè)wheelview的可見條目數(shù)
provinceView.setVisibleItems(7); cityView.setVisibleItems(7); districtView.setVisibleItems(7);
為三個(gè) wheelview添加滑動(dòng)事件
// 添加change事件 provinceView.addChangingListener(this); // 添加change事件 cityView.addChangingListener(this); // 添加change事件 districtView.addChangingListener(this);
c. 拿到操作數(shù)據(jù)的對(duì)象SQLiteDatabase
db = dataHelper.openDataBase();
觀察數(shù)據(jù)庫(kù)文件可知這表中是根據(jù)字段level來判斷省市區(qū)的,如圖
同時(shí)我們也可知這省市區(qū)三個(gè)模型中的字段都是一樣的,都是
private int cityID; private int parentId; private int level; private String name; private String pinyin;
不清楚的可以自己查下表,如圖,我查一個(gè)省
所以我們建立一樣的模型,雖然三個(gè)字段是一樣的,建一個(gè)就可以了,但是為了標(biāo)準(zhǔn)最好還是建三個(gè)。
package guozhaohui.com.wlylocationchoose.locationchoose.model; public class ProvinceModel { private int cityID; private int parentId; private int level; private String name; private String pinyin; public int getCityID() { return cityID; } public void setCityID(int cityID) { this.cityID = cityID; } public int getParentId() { return parentId; } public void setParentId(int parentId) { this.parentId = parentId; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPinyin() { return pinyin; } public void setPinyin(String pinyin) { this.pinyin = pinyin; } }
進(jìn)行sql查詢,將查詢到的結(jié)果保存在cursor中,然后進(jìn)行一行行的循環(huán)遍歷,然后將遍歷一行的對(duì)象添加到這個(gè)對(duì)象的集合中。這里得到省的集合。
public List<ProvinceModel> getProvice(SQLiteDatabase db){ String sql="SELECT * FROM ChooseCityModel where level = 1 ORDER BY cityID"; Cursor cursor = db.rawQuery(sql,null); List<ProvinceModel> list=new ArrayList<ProvinceModel>(); if (cursor!=null&&cursor.getCount() > 0) { while (cursor.moveToNext()){ ProvinceModel provinceModel=new ProvinceModel(); provinceModel.setCityID(cursor.getInt(cursor.getColumnIndex("cityID"))); provinceModel.setParentId(cursor.getInt(cursor.getColumnIndex("parentId"))); provinceModel.setLevel(cursor.getInt(cursor.getColumnIndex("level"))); provinceModel.setName(cursor.getString(cursor.getColumnIndex("name"))); provinceModel.setPinyin(cursor.getString(cursor.getColumnIndex("pinyin"))); list.add(provinceModel); } } return list; }
根據(jù)表的結(jié)構(gòu),得到相應(yīng)的sql語句,希望根據(jù)上一級(jí)省的cityId得到下面的市,其實(shí)換句話說本級(jí)市的parentId就是上一級(jí)的cityid,不清楚的可以將sql語句查一遍,驗(yàn)證下對(duì)不對(duì),如圖
得到相應(yīng)省下面市的集合
public List<CityModel> getCityByParentId(SQLiteDatabase db, String code){ String sql="SELECT * FROM ChooseCityModel WHERE level = 2 and parentId = ? ORDER BY cityID"; Cursor cursor = db.rawQuery(sql,new String[][code]); List<CityModel> list=new ArrayList<CityModel>(); if (cursor!=null&&cursor.getCount() > 0) { while (cursor.moveToNext()){ CityModel cityModel=new CityModel(); cityModel.setCityID(cursor.getInt(cursor.getColumnIndex("cityID"))); cityModel.setParentId(cursor.getInt(cursor.getColumnIndex("parentId"))); cityModel.setLevel(cursor.getInt(cursor.getColumnIndex("level"))); cityModel.setName(cursor.getString(cursor.getColumnIndex("name"))); cityModel.setPinyin(cursor.getString(cursor.getColumnIndex("pinyin"))); list.add(cityModel); } } return list; }
區(qū)也是一樣的,直接貼代碼了
public List<DistrictModel> getDistrictById(SQLiteDatabase db, String code){ //注意這里的parentId其實(shí)就是上一級(jí)的cityID String sql="SELECT * FROM ChooseCityModel WHERE level = 3 and parentId = ? ORDER BY cityID"; Cursor cursor = db.rawQuery(sql,new String[][code]); List<DistrictModel> list=new ArrayList<DistrictModel>(); if (cursor!=null&&cursor.getCount() > 0) { while (cursor.moveToNext()){ DistrictModel districtModel=new DistrictModel(); districtModel.setCityID(cursor.getInt(cursor.getColumnIndex("cityID"))); districtModel.setParentId(cursor.getInt(cursor.getColumnIndex("parentId"))); districtModel.setLevel(cursor.getInt(cursor.getColumnIndex("level"))); districtModel.setName(cursor.getString(cursor.getColumnIndex("name"))); districtModel.setPinyin(cursor.getString(cursor.getColumnIndex("pinyin"))); list.add(districtModel); } } return list; }
d. 對(duì)彈出popuwindow顯示的wheelview進(jìn)行初始化,注釋都寫在代碼里,
private void initpopData() { //初始化數(shù)據(jù) dataHelper = CityDataHelper.getInstance(this); db = dataHelper.openDataBase(); provinceDatas = dataHelper.getProvice(db); if (provinceDatas.size() > 0) { //彈出popup時(shí),省wheelview中當(dāng)前的省其實(shí)就是省集合的第一個(gè) mCurrentProvince = provinceDatas.get(0).getName(); //根據(jù)省cityid查詢到第一個(gè)省下面市的集合 cityDatas = dataHelper.getCityByParentId(db, provinceDatas.get(0).getCityID()+""); } if (cityDatas.size() > 0) { //根據(jù)市cityid查詢到第一個(gè)市集合下面區(qū)的集合 districtDatas = dataHelper.getDistrictById(db, cityDatas.get(0).getCityID()+""); } //wheelview的適配器代碼 provinceAdapter = new ProvinceAdapter(this, provinceDatas); provinceAdapter.setTextSize(TEXTSIZE);//設(shè)置字體大小 provinceView.setViewAdapter(provinceAdapter); updateCitys(); updateAreas(); }
更新省下面市的wheelview內(nèi)容,注釋很清楚,直接上代碼
private void updateCitys() { int pCurrent = provinceView.getCurrentItem(); if (provinceDatas.size() > 0) { //這里是必須的的,上面得到的集合只是第一個(gè)省下面所有市的集合及第一個(gè)市下面所有區(qū)的集合 //這里得到的是相應(yīng)省下面對(duì)應(yīng)市的集合 cityDatas = dataHelper.getCityByParentId(db, provinceDatas.get(pCurrent).getCityID()+""); } else { cityDatas.clear(); } citysAdapter = new CitysAdapter(this, cityDatas); citysAdapter.setTextSize(TEXTSIZE); cityView.setViewAdapter(citysAdapter); if (cityDatas.size() > 0) { //默認(rèn)省下面 市wheelview滑動(dòng)第一個(gè),顯示第一個(gè)市 cityView.setCurrentItem(0); mCurrentCity = cityDatas.get(0).getName(); } else { mCurrentCity = ""; } updateAreas(); }
第三個(gè)wheelview和第二個(gè)一樣的,代碼直接上
private void updateAreas() { int cCurrent = cityView.getCurrentItem(); if (cityDatas.size() > 0) { districtDatas = dataHelper.getDistrictById(db, cityDatas.get(cCurrent).getCityID()+""); } else { districtDatas.clear(); } areaAdapter = new AreaAdapter(this, districtDatas); areaAdapter.setTextSize(TEXTSIZE); districtView.setViewAdapter(areaAdapter); if (districtDatas.size() > 0) { mCurrentDistrict = districtDatas.get(0).getName(); districtView.setCurrentItem(0); } else { mCurrentDistrict = ""; } }
關(guān)于如何在Android中使用WheelView實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。