Android-省市區(qū)三級聯動

省市區(qū)三級聯動

下載地址:https://code.google.com/p/android-wheel/自備梯子

  • 效果圖


    三級聯動

如果想更改樣式需要更改源碼

單級滾動

把下載好的做為module導入項目挣饥,并添加依賴

這里寫圖片描述

這樣就可以像使用普通控件一樣使用了


    <kankan.wheel.widget.WheelView
        android:id="@+id/wheelviewTimer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

Activty

  mWheelViewTimer = (WheelView) findViewById(R.id.wheelviewTimer);
   for(int i = 0; i <24 ; i++) {
            mDatas.add(i+"");
        }

        //設置可以見的條目數量亮瓷, 上中下
        mWheelViewTimer.setVisibleItems(5);

        //設置適配器
        mTimerAdapter = new TimerAdapter(this,mDatas);

        mWheelViewTimer.setViewAdapter(mTimerAdapter);

        //放在最后面 設置當前顯示的
        mWheelViewTimer.setCurrentItem(5);

適配器

感覺和ListView有沒有一點像呢,都是要設置適配器

public class TimerAdapter extends AbstractWheelTextAdapter {

    List<String> mDatas;
    Context      mContext;
 

    public TimerAdapter(Context context, List<String> datas) {

        super(context, R.layout.item_time, NO_RESOURCE);

        mContext = context;
        mDatas = datas;
        setItemTextResource(R.id.time);
    }

    @Override
    protected CharSequence getItemText(int index) {
        return mDatas.get(index);
    }

    @Override
    public int getItemsCount() {
        return mDatas.size();
    }

    @Override
    public View getItem(int index, View convertView, ViewGroup parent) {

        View view = super.getItem(index, convertView, parent);

        return view;

    }

這樣就完成了,一個滾動


這里寫圖片描述

三級聯動

看了一級的,三級的說白了就是3個這個控件

布局


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:orientation="horizontal">

        <kankan.wheel.widget.WheelView
            android:id="@+id/province"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />

        <kankan.wheel.widget.WheelView
            android:id="@+id/city"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />

        <kankan.wheel.widget.WheelView
            android:id="@+id/area"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />

    </LinearLayout>

適配器和上面一樣

public class AddressTextAdapter extends AbstractWheelTextAdapter {
    List<String> mDatas;
    Context mContext;

    public AddressTextAdapter(Context context, List<String> datas) {
        super(context, R.layout.item_address,NO_RESOURCE);
        mContext = context;
        mDatas=datas;
        //設置資源要顯示在那個控件上
        setItemTextResource(R.id.tempValue);
    }

    @Override
    protected CharSequence getItemText(int index) {
        return mDatas.get(index);
    }

    @Override
    public int getItemsCount() {
        return mDatas.size();
    }

    @Override
    public View getItem(int index, View convertView, ViewGroup parent) {

        View view = super.getItem(index,convertView,parent);

        return view;
    }

    public String getName(int index){
        return mDatas.get(index);
    }

Activity初始化數據

  • 找到3個控件
 mProvince = (WheelView) findViewById(R.id.province);
        mCity = (WheelView) findViewById(city);
        mArea = (WheelView) findViewById(R.id.area);
  • 初始化數據
 //讀取文件
        String str = FileUtils.readAssetsFile(this, "china-city-area-zip.min.json");

        Log.d("vivi", "initData:  " + str);

        //轉化為對象集合
        List<RegionJson> datas = JSON.parseArray(str, RegionJson.class);

這里的數據放在Assets目錄下的json文件泼菌,讀取文件,解析就OK,數據在最下面可以找到

  • 分類數據
 for(RegionJson data : datas) {

            //省
            mProvinceList.add(data.name);

            List<String> mCitysList    = new ArrayList<>();

            for(RegionJson.ChildEntity city : data.child) {

                //市

                mCitysList.add(city.name);
                List<String> mAreaList     = new ArrayList<>();
                for(RegionJson.ChildEntity.ChildEntity2 area : city.child) {
                    //區(qū)

                    mAreaList.add(area.name);
                }

                //市-區(qū)對該 
                mAreaDatasMap.put(city.name,mAreaList);

            }
            //省支市對應
            mCitisDatasMap.put(data.name,mCitysList);

        }
  • 為三個控件設置適配器
 /**
         *  省
         */

        mProvince.setVisibleItems(5);

        mProviceAdapter = new AddressTextAdapter(this, mProvinceList);
        mProvince.setViewAdapter(mProviceAdapter);
        mProvince.setCurrentItem(0);

        /**
         * 市
         */
        mCity.setVisibleItems(5);

        mCityAdapter = new AddressTextAdapter(this, mCitisDatasMap.get(mProvinceList.get(0)));
        mCity.setViewAdapter(mCityAdapter);
        mCity.setCurrentItem(0);

        /**
         * 地區(qū)
         */

        mArea.setVisibleItems(5);

        mAreaAdapter = new AddressTextAdapter(this, mAreaDatasMap.get(mCitisDatasMap.get(mProvinceList.get(0)).get(0)));
        mArea.setViewAdapter(mAreaAdapter);
        mArea.setCurrentItem(0);

設置監(jiān)聽滾動完成里切換


private void initScrllListener() {
        /**
         * 省滾動完成時切換 城市與地區(qū)
         */
        mProvince.addScrollingListener(new OnWheelScrollListener() {
            @Override
            public void onScrollingStarted(WheelView wheel) {
                //標記位-開始滾動
                proviceScrolling =true;
            }

            @Override
            public void onScrollingFinished(WheelView wheel) {

                proviceScrolling =false;
                //省滾動完成后切換市
                updateCities(mCity,mCitisDatasMap.get(mProviceAdapter.getName(mProvince.getCurrentItem())));
                //更新地區(qū)
                updateArea(mArea,mAreaDatasMap.get(mCityAdapter.getName(mCity.getCurrentItem())));

            }
        });

        /**
         * 市滾動 完成時切換地區(qū)
         */
        mCity.addScrollingListener(new OnWheelScrollListener() {
            @Override
            public void onScrollingStarted(WheelView wheel) {
                //標記位-開始滾動
                cityScrolling=true;
            }

            @Override
            public void onScrollingFinished(WheelView wheel) {
                cityScrolling =false;

                //市滾動完成后切換
               updateArea(mArea,mAreaDatasMap.get(mCityAdapter.getName(mCity.getCurrentItem())));

            }
        });
    }

這樣就基本完成了

完善滾動中時也可以切換

         /**
         * 省滾動中切換市
         */
        mProvince.addChangingListener(new OnWheelChangedListener() {
            @Override
            public void onChanged(WheelView wheel, int oldValue, int newValue) {

                //省在滾動
                if(proviceScrolling){
                    //更新城市
                    updateCities(mCity,mCitisDatasMap.get(mProviceAdapter.getName(newValue)));

                        //更新地區(qū)
                        updateArea(mArea,mAreaDatasMap.get(mCityAdapter.getName(mCity.getCurrentItem())));

                }

            }

        });
  mCity.addChangingListener(new OnWheelChangedListener() {
            @Override
            public void onChanged(WheelView wheel, int oldValue, int newValue) {

                if(cityScrolling){
                    updateArea(mArea,mAreaDatasMap.get(mCityAdapter.getName(newValue)));
                }
            }
        });

更新數據的2個方法


    /**
     * 切換城市
     */
    private void updateCities(WheelView city, List<String> cities) {

        mCityAdapter = new AddressTextAdapter(this,cities);

        city.setViewAdapter(mCityAdapter);
        city.setCurrentItem(0);
    }

----------
 private void updateArea(WheelView area,List<String> areas){
       mAreaAdapter= new AddressTextAdapter(this,areas);

        area.setViewAdapter(mAreaAdapter);
        area.setCurrentItem(0);
    }

源碼:https://github.com/ln0491/WheelDemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓷耙,隨后出現的幾起案子,更是在濱河造成了極大的恐慌刁赖,老刑警劉巖搁痛,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異宇弛,居然都是意外死亡鸡典,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門枪芒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彻况,“玉大人谁尸,你說我怎么就攤上這事×贫猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵硫朦,是天一觀的道長贷腕。 經常有香客問我,道長咬展,這世上最難降的妖魔是什么泽裳? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任苹熏,我火速辦了婚禮犬钢,結果婚禮上,老公的妹妹穿的比我還像新娘掌栅。我一直安慰自己祷舀,他們只是感情好瀑梗,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裳扯,像睡著了一般抛丽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饰豺,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天亿鲜,我揣著相機與錄音,去河邊找鬼冤吨。 笑死蒿柳,一個胖子當著我的面吹牛,可吹牛的內容都是我干的漩蟆。 我是一名探鬼主播垒探,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怠李!你這毒婦竟也來了叛复?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤扔仓,失蹤者是張志新(化名)和其女友劉穎褐奥,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體翘簇,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡撬码,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了版保。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呜笑。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡夫否,死狀恐怖,靈堂內的尸體忽然破棺而出叫胁,到底是詐尸還是另有隱情凰慈,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布驼鹅,位于F島的核電站微谓,受9級特大地震影響,放射性物質發(fā)生泄漏输钩。R本人自食惡果不足惜豺型,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望买乃。 院中可真熱鬧姻氨,春花似錦、人聲如沸剪验。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽功戚。三九已至抖韩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疫铜,已是汗流浹背茂浮。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壳咕,地道東北人席揽。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谓厘,于是被迫代替她去往敵國和親幌羞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容