安卓 使用WheelView进行滚动框开发(联动版) (22)

我们之前看过TimePicker的用法,但是TimePicker的使用则很死板,只能是时和分,没有其他东西,这时候我们可以使用自定义的WheelView来进行开发。

对于WheelView,我觉得恶意满满,因为网上很多大神都自己写过WheelView,所以封装的方式,里面的方法也是各有不同,如果从一个地方compile一个WheelView版本,很有可能看着另一篇教程,写出来的东西让自己一脸懵逼(比如写着写着发现为什么我的WheelView中没有这个方法啊)。所以我下面的东西是根据一整篇教程做出来的(自己加了很多注释,方便自己理解吧),教程原地址:https://blog.csdn.net/yangxin1113/article/details/51669678(侵删)

首先我们需要导入一个WheelView:

Github地址:https://github.com/venshine/WheelView

 compile 'com.wx.wheelview:wheelview:1.3.3'

之后创建一个三级的布局(这里实现的是一个省市区的滚动联动):



    

        

        

        

    '

    

之后在Activity中的写法如下(注释蛮多的,慢慢食用):

public class CityActivity extends AppCompatActivity {

    private WheelView wheel_province;
    private WheelView wheel_city;
    private WheelView wheel_area;

    private Button btn_city;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_city);

        wheel_province = findViewById(R.id.wheel_province);
        wheel_city = findViewById(R.id.wheel_city);
        wheel_area = findViewById(R.id.wheel_area);

        //定义WheelView的style,比如选中文字大小和其他文字大小(这里WheelView已经封装了)
        WheelView.WheelViewStyle style = new WheelView.WheelViewStyle();
        style.selectedTextSize = 20;
        style.textSize = 16;

        //在这里设置一个WheelView的Adapter作为数据源的适配器
        wheel_province.setWheelAdapter(new ArrayWheelAdapter(this));
        //为WheelView设置一个皮肤风格(这里在WheelView中已经封装了一个Holo)
        wheel_province.setSkin(WheelView.Skin.Holo);
        //这里将数据放入WheelView中
        wheel_province.setWheelData(createProvinceDatas());
        //设置WheelView的Style(上面已经定义)
        wheel_province.setStyle(style);

        wheel_city.setWheelAdapter(new ArrayWheelAdapter(this));
        wheel_city.setSkin(WheelView.Skin.Holo);
        //这里就很奇妙了,我详细说一下
        //看下面的几个创建数据的函数,从province到city再到area,其中的返回类型中分别为List,HashMap>, HashMap>
        //其中第一种为String列表,也就是第一个省份的列表可以直接通过String列表得到。
        //HashMap是哈希表,他里面的值都是通过key-value进行对应,所以在这个情况中就是一个省(String key)对应着一个市(String value)的列表(同理得到第二个市与区的关系)
        //HashMap.get(key)方法是用来通过key的值来得到value的值
        //WheelView.getSelection()通过看就知道是一个获取位置的方法(大神在WheelView中封装好了).
        //综上所述,其实这条东西,逆向来读就是,通过得到省的WheelView的位置来得到省的value值,而省的value值就是市的key值,所以说可以得到市的一整个value值。
        wheel_city.setWheelData(createCityDatas().get(createProvinceDatas().get(wheel_province.getSelection())));
        wheel_city.setStyle(style);

        //这里是把省的WheelView与市的WheelView连接起来(封装好的)(加入下一级的WheelView)
        wheel_province.join(wheel_city);
        //这里是把省的WheelView与市的WheelView的数据连接起来
        wheel_province.joinDatas(createCityDatas());

        wheel_area.setWheelAdapter(new ArrayWheelAdapter(this));
        wheel_area.setSkin(WheelView.Skin.Holo);
        //这个嘛,上面解释过了,但是又臭又长,简单说一下
        //其实就匹配了两次,通过得到省和市的位置来定位到他们两个的value,再通过value得到区的value值
        wheel_area.setWheelData(createAreaDatas().get(createCityDatas().get(createProvinceDatas().get(wheel_province.getSelection())).get(wheel_city.getSelection())));
        wheel_area.setStyle(style);

        wheel_city.join(wheel_area);
        wheel_city.joinDatas(createAreaDatas());

        btn_city = findViewById(R.id.city_btn);
        btn_city.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String province = wheel_province.getSelectionItem().toString();
                String city = wheel_city.getSelectionItem().toString();
                String area = wheel_area.getSelectionItem().toString();

                Toast.makeText(CityActivity.this, province + city + area, Toast.LENGTH_SHORT).show();
            }
        });

    }

    //这里是第一级,所以直接把他放入一个List中就可以了
    private List createProvinceDatas() {
        String[] strings = {"黑龙江", "吉林", "辽宁"};
        //将字符数组转换为List形式
        return Arrays.asList(strings);
    }


    private HashMap> createCityDatas() {
        //新建一个哈希表
        HashMap> map = new HashMap>();
        String[] strings = {"黑龙江", "吉林", "辽宁"};
        String[] s1 = {"哈尔滨", "齐齐哈尔", "大庆"};
        String[] s2 = {"长春", "吉林"};
        String[] s3 = {"沈阳", "大连", "鞍山", "抚顺"};
        String[][] ss = {s1, s2, s3};
        for (int i = 0; i < strings.length; i++) {
            //在这里把key与value分别列出,然后通过HashMap.put进行配对然后写入哈希表。
            map.put(strings[i], Arrays.asList(ss[i]));
        }
        // 一个哈希表的输出检测(自学哈希表时测试一下用的,自己也可以试试)
//        Iterator iter = map.entrySet().iterator();
//        while(iter.hasNext()) {
//            Map.Entry entry = (Map.Entry) iter.next();
//            Object key = entry.getKey();
//            Object value = entry.getValue();
//            Log.v("second",key + ":" + value);
//        }
        return map;
    }


    private HashMap> createAreaDatas() {
        HashMap> map = new HashMap>();
        String[] strings = {"哈尔滨", "齐齐哈尔", "大庆", "长春", "吉林", "沈阳", "大连", "鞍山", "抚顺"};
        String[] s1 = {"道里区", "道外区", "南岗区", "香坊区"};
        String[] s2 = {"龙沙区", "建华区", "铁锋区"};
        String[] s3 = {"红岗区", "大同区"};
        String[] s11 = {"南关区", "朝阳区"};
        String[] s12 = {"龙潭区"};
        String[] s21 = {"和平区", "皇姑区", "大东区", "铁西区"};
        String[] s22 = {"中山区", "金州区"};
        String[] s23 = {"铁东区", "铁西区"};
        String[] s24 = {"新抚区", "望花区", "顺城区"};
        String[][] ss = {s1, s2, s3, s11, s12, s21, s22, s23, s24};
        for (int i = 0; i < strings.length; i++) {
            map.put(strings[i], Arrays.asList(ss[i]));
        }
//        Iterator iter = map.entrySet().iterator();
//        while(iter.hasNext()) {
//            Map.Entry entry = (Map.Entry) iter.next();
//            Object key = entry.getKey();
//            Object value = entry.getValue();
//            Log.v("first",key + ":" + value);
//        }
        return map;
    }
}

你可能感兴趣的:(安卓)