仿淘宝地址联动选择

这里写图片描述

这个效果的其实就是列表数据的刷新,选择对应的省份同时获取其下面的城市数据并刷新列表,选择对应的城市同时获取其下面的区县数据并刷新列表,并将选择好的数据返回给上一个页面;当触发返回或者物理返回键的时候做同样的处理就可以了。

实现主要代码:

public class DataActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tvBack;
    private ListView listview;
    private ChoseDataAdapter choseDataAdapter;
    private List<PlaceInfo> pList = new ArrayList<>();
    private int cityIndex = 0;
    private String prvStr, cityStr, townCity;//省份名称 城市名称  区县名称
    private String prvId, cityId, townId;//省份id  城市id 区县id

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_data);
        initView();
    }

    private void initView() {
        tvBack = (TextView) findViewById(R.id.tv_back);
        tvBack.setOnClickListener(this);

        ParseData.jsonToData(this);
        //省份数据
        pList = PrioviceInfo.getProvice();

        listview = (ListView) findViewById(R.id.listview);
        listview.setDivider(null);
        choseDataAdapter = new ChoseDataAdapter(DataActivity.this, pList);
        listview.setAdapter(choseDataAdapter);

        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                cityIndex++;
                if (cityIndex == 1) {
                    PlaceInfo placeInfo = pList.get(position);
                    //获取选择的省份名称和id
                    prvStr = stringTOString(placeInfo.dict_name);
                    prvId = stringTOString(placeInfo.dict_id);
                    //获取选择该省份对应的市县
                    pList = PrioviceInfo.getCity(prvId);
                    if (pList.size() == 0) {
                        placeInfo.valueName = prvStr;
                        placeInfo.id_1 = prvId;
                        getDataBack(placeInfo);
                    } else {
                        //刷新城市数据并显示
                        choseDataAdapter.nodfiyData(pList);
                    }
                } else if (cityIndex == 2) {
                    PlaceInfo cityInfo = pList.get(position);
                    //获取选择的城市名称和id
                    cityStr = stringTOString(cityInfo.dict_name);
                    cityId = stringTOString(cityInfo.dict_id);
                    //获取选择的城市对应的区县数据
                    pList = PrioviceInfo.getTown(cityId);
                    if (pList.size() == 0) {
                        cityInfo.valueName = prvStr + " " + cityStr;
                        cityInfo.id_1 = prvId;
                        cityInfo.id_2 = cityId;
                        getDataBack(cityInfo);
                    } else {
                        //刷新显示区县数据
                        choseDataAdapter.nodfiyData(pList);
                    }
                } else if (cityIndex == 3) {
                    PlaceInfo townInfo = pList.get(position);
                    townCity = stringTOString(townInfo.dict_name);
                    townId = stringTOString(townInfo.dict_id);
                    townInfo.valueName = prvStr + " " + cityStr + " " + townCity;
                    townInfo.id_1 = prvId;
                    townInfo.id_2 = cityId;
                    townInfo.id_3 = townId;
                    getDataBack(townInfo);
                }
            }
        });
    }

    /**
     * 返回上一级页面,并返回好的数据
     *
     * @param info
     */
    private void getDataBack(PlaceInfo info) {
        Intent intent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putSerializable("datainfo", info);
        intent.putExtras(bundle);
        setResult(RESULT_OK, intent);
        finish();

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_back:
                toBack();
                break;
        }
    }

    class ChoseDataAdapter extends DefaultAdapter<PlaceInfo> {
        public ChoseDataAdapter(Context context, List<PlaceInfo> list) {
            super(context, list);
        }

        @Override
        protected BaseHolder<PlaceInfo> getHolder() {
            return new ChoseDataHolder();
        }

        @Override
        public void refreshUi(View convertView, int position) {

        }
    }

    class ChoseDataHolder extends BaseHolder<PlaceInfo> {
        TextView valueText;

        @Override
        public void refreshView(List<PlaceInfo> list, int pos) {
            PlaceInfo sysBasicData = list.get(pos);
            this.valueText.setText("" + sysBasicData.dict_name);
        }

        @Override
        public View initView() {
            View convertView = View.inflate(DataActivity.this, R.layout.chose_data_view, null);
            this.valueText = findID(convertView, R.id.valueText);
            return convertView;
        }

    }
    private String stringTOString(String value) {
        return value == null ? "" : value;
    }

    /**
     * 返回方法
     */
    private void toBack() {
        cityIndex--;
        if (cityIndex == 1) {
            //显示上一级城市
            pList = PrioviceInfo.getCity(prvId);
            choseDataAdapter.nodfiyData(pList);
        } else if (cityIndex== 0) {
            pList=PrioviceInfo.getProvice();
            choseDataAdapter.nodfiyData(pList);
        } else if (cityIndex == -1) {
            finish();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            toBack();
        }
        return true;
    }
}

这样子就可以了。

源码地址:
https://pan.baidu.com/s/1boYvCAV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值