Android:三级城市联动控件

AdressDialog是一个Android归属地选择对话框,用于三级城市联动。该对话框使用WheelView组件展示省、市、县三级选项,并根据选择自动更新。每个级别使用ArrayWheelAdapter进行数据适配,通过监听滚轮变化来更新下一级别数据。用户点击确定按钮后,返回选定的省市区全名和ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import com...Contants;
import com...R;
import com...domain.AdressInfo;
import com...ui.activity.LotteryBaseActivity;
import com...ui.widget.wheel.AbstractWheelTextAdapter;
import com...ui.widget.wheel.OnWheelChangedListener;
import com...ui.widget.wheel.WheelView;
import java.util.ArrayList;

/**
 * 归属地选择对话框
 */
public class AdressDialog extends LotteryBaseActivity implements OnClickListener {

    private WheelView mProvinceWv, mCityWv, mCountyWv;
    private ArrayWheelAdapter mProvinceAdapter, mCityAdapter, mCountyAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.adressdialog);
        Button cancelBtn = (Button) findViewById(R.id.btn_adressdialog_cancel);
        cancelBtn.setOnClickListener(this);
        Button okBtn = (Button) findViewById(R.id.btn_adressdialog_ok);
        okBtn.setOnClickListener(this);
        WindowManager m = getWindowManager();
        Display d = m.getDefaultDisplay();
        android.view.WindowManager.LayoutParams p = getWindow().getAttributes();
        p.y = 0;
        p.width = d.getWidth();
        p.gravity = Gravity.BOTTOM;
        getWindow().setAttributes(p);
        String fullname = getIntent().getStringExtra("fullname");
        mProvinceWv = (WheelView) findViewById(R.id.wv_adressdialog_province);
        mProvinceWv.setVisibleItems(5);
        mProvinceWv.setShowLeftLine(true);
        mProvinceAdapter = new ArrayWheelAdapter(this, mAdressDao.getProvinces());
        mProvinceWv.setViewAdapter(mProvinceAdapter);
        mProvinceWv.setCyclic(true);
        mProvinceWv.addChangingListener(new OnWheelChangedListener() {
 
 
            public void onChanged(WheelView wheel, int oldValue, int newValue) {
                mCityAdapter = new ArrayWheelAdapter(AdressDialog.this, mAdressDao.getCitys(mProvinceAdapter.getId(mProvinceWv.getCurrentItem())));
                mCityWv.setViewAdapter(mCityAdapter);
                mCityWv.setCurrentItem(mCityAdapter.getItemsCount() / 2);
            }
        });

        mCityWv = (WheelView) findViewById(R.id.wv_adressdialog_city);
        mCityWv.setVisibleItems(5);
        mCityWv.setShowLeftLine(false);
        mCityAdapter = new ArrayWheelAdapter(this, mAdressDao.getCitys(mProvinceAdapter.getId(mProvinceWv.getCurrentItem())));
        mCityWv.setViewAdapter(mCityAdapter);
        mCityWv.setCyclic(true);
        mCityWv.addChangingListener(new OnWheelChangedListener() {
            public void onChanged(WheelView wheel, int oldValue, int newValue) {
 
 
                mCountyAdapter = new ArrayWheelAdapter(AdressDialog.this, mAdressDao.getCountys(mCityAdapter.getId(mCityWv.getCurrentItem())));
                mCountyWv.setViewAdapter(mCountyAdapter);
                mCountyWv.setCurrentItem(mCountyAdapter.getItemsCount() / 2);
            }
        });

        mCountyWv = (WheelView) findViewById(R.id.wv_adressdialog_county);
        mCountyWv.setVisibleItems(5);
        mCountyWv.setShowLeftLine(false);
        mCountyAdapter = new ArrayWheelAdapter(this, mAdressDao.getCountys(mCityAdapter.getId(mCityWv.getCurrentItem())));
        mCountyWv.setViewAdapter(mCountyAdapter);
        mCountyWv.setCyclic(true);

        mProvinceWv.setCurrentItem(mProvinceAdapter.getItemsCount() / 2);
        mCityWv.setCurrentItem(mCityAdapter.getItemsCount() / 2);
        mCountyWv.setCurrentItem(mCountyAdapter.getItemsCount() / 2);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_adressdialog_cancel:
                finish();
                break;
            case R.id.btn_adressdialog_ok:
                String province = mProvinceAdapter.getItemText(mProvinceWv.getCurrentItem()).toString();
                String city = mCityAdapter.getItemText(mCityWv.getCurrentItem()).toString();
                String county = mCountyAdapter.getItemText(mCountyWv.getCurrentItem()).toString();
                String countyFullname = mCountyAdapter.getItemFullname(mCountyWv.getCurrentItem()).toString();
                Intent data = new Intent();
                data.putExtra("adressName", province + " " + city + " " + county);
                data.putExtra("fullname", countyFullname);
                data.putExtra("adressId", mCountyAdapter.getCode(mCountyWv.getCurrentItem()));
                setResult(Contants.ACTIVITY_CODE_ADRESS, data);
                finish();
                break;
        }
    }

    /**
     * 滑动内容adapter
     */
    private class ArrayWheelAdapter extends AbstractWheelTextAdapter {
        private ArrayList<AdressInfo> infos = new ArrayList<AdressInfo>();

        public int getPositionByName(String adress) {
            int len = infos.size();
            for (int i = 0; i < len; i++) {
                if (adress.equals(infos.get(i).name)) {
                    return i;
                }
            }
            return 0;
        }

        protected ArrayWheelAdapter(Context context) {
            super(context, R.layout.adressdialog_item, NO_RESOURCE);
        }

        public ArrayWheelAdapter(Context context, ArrayList<AdressInfo> infos) {
            super(context, R.layout.adressdialog_item, NO_RESOURCE);
            this.infos = infos;
        }

        @Override
        public View getItem(int position, View cachedView, ViewGroup parent) {
            View view = super.getItem(position, cachedView, parent);
            TextView tv = (TextView) view.findViewById(R.id.tv_adressdialog_item);
            tv.setText(infos.get(position).name);
            return view;
        }

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

        @Override
        protected CharSequence getItemText(int position) {
            if (infos.size() > 0 && position < infos.size()) {
                return infos.get(position).name;
            }
            return "";
        }

        public String getItemFullname(int position) {
            if (infos.size() > 0 && position < infos.size()) {
                return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值