android基本控件示例两个Spinner下拉列表的关联(04)

//两个下拉列表Spinner的关联
public class MainActivity extends Activity {
	private Spinner provice_sp;
	private Spinner city_sp;
	private ArrayAdapter<String> provice_adapter;
	private ArrayAdapter<String> city_adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		provice_sp = (Spinner) this.findViewById(R.id.provice_sp);
		city_sp = (Spinner) this.findViewById(R.id.city_sp);
		// 从xml文件中加载数据给适配器绑定数据
		XmlPullParser parser = getResources().getXml(R.xml.citys_weather);
		final Map<String, List<String>> dataMap = parserXMLData(parser);
		// 建适配器//加载省份的spinner数据
		Set<String> set = dataMap.keySet();// 省份作为键值
		// 因为适配器不能放集合,但可以放list数组,所以转换为list
		List<String> provicelist = new ArrayList<String>(set);
		provice_adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_1, provicelist);
		provice_sp.setAdapter(provice_adapter);// 关联绑定适配器
		city_adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_1);
		// 城市先不给数据源,先关联绑定适配器,数据下面再给
		city_sp.setAdapter(city_adapter);
		// 设置监听,点击省份的时候产生事件
		provice_sp.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				// 这里addAll会报错,改版本就行,它是高版本的,所以要改版本号
				city_adapter.clear();// 每次都清空前面点击后添加的内容,否则他会累积
				// 法1
				String name = parent.getSelectedItem().toString();
				// 法2://String name=provice_adapter.getItem(position);
				// 法3://String
				// name=parent.getItemAtPosition(position).toString();
				city_adapter.addAll(dataMap.get(name));//省名作为键,通过键就可以获得该省的城市
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {

			}
		});
	}

	private Map<String, List<String>> parserXMLData(XmlPullParser parser) {
		Map<String, List<String>> map = new HashMap<String, List<String>>();
		List<String> citylist = null;
		try {
			int event = parser.getEventType();
			while (event != XmlPullParser.END_DOCUMENT) {
				switch (event) {
				case XmlPullParser.START_DOCUMENT:
					break;
				// 注意START_DOCUMENT只执行一次,所以不能在这里实例化城市,因为p循环调用的
				case XmlPullParser.START_TAG:
					if ("p".equals(parser.getName())) {
						// 进入时实例化城市集合
						citylist = new ArrayList<String>();
					}
					if ("pn".equals(parser.getName())) {
						map.put(parser.nextText(), citylist);// list在后面再加
					}
					if ("d".equals(parser.getName())) {
						citylist.add(parser.nextText());
					}

					break;
				case XmlPullParser.END_TAG:
					if ("p".equals(parser.getName())) {
						citylist = null;
					}
					break;
				}
				event = parser.next();
			}
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return map;
	}
}
//布局文件:相对布局

    <Spinner
        android:id="@+id/provice_sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="" />
    <Spinner
        android:id="@+id/city_sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/provice_sp"
        android:text="" />
 //文件citys_weather.xml
 <citylist>
	<p p_id = "01">
	<pn>北京</pn>
	<c c_id="0101"><cn>北京</cn>
		<d d_id="101010100">北京</d>
		<d d_id="101010200">海淀</d>
		<d d_id="101010300">朝阳</d>
		<d d_id="101010400">顺义</d>
		<d d_id="101010500">怀柔</d>
		<d d_id="101010600">通州</d>
		<d d_id="101010700">昌平</d>
		<d d_id="101010800">延庆</d>
		<d d_id="101010900">丰台</d>
		<d d_id="101011000">石景山</d>
		<d d_id="101011100">大兴</d>
		<d d_id="101011200">房山</d>
		<d d_id="101011300">密云</d>
		<d d_id="101011400">门头沟</d>
		<d d_id="101011500">平谷</d>
	</c>
	</p>

	<p p_id = "02">
	<pn>上海</pn>
		<c c_id="0201"><cn>上海</cn>
				<d d_id="101020100">上海</d>
				<d d_id="101020200">闵行</d>
				<d d_id="101020300">宝山</d>
				<d d_id="101020500">嘉定</d>
				<d d_id="101020600">浦东南汇</d>
				<d d_id="101020700">金山</d>
				<d d_id="101020800">青浦</d>
				<d d_id="101020900">松江</d>
				<d d_id="101021000">奉贤</d>
				<d d_id="101021100">崇明</d>
				<d d_id="101021200">徐家汇</d>
				<d d_id="101021300">浦东</d>
			</c>
		</p>
 </citylist>


转载于:https://my.oschina.net/u/2541146/blog/603642

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android中使用Spinner下拉列表,您可以按照以下步骤创建一个新的应用程序: 1. 打开Android Studio,并创建一个新的空白项目。 2. 在res/layout目录中创建一个新的XML文件,例如“activity_main.xml”。 3. 在XML布局文件中添加Spinner控件。例如: ``` <Spinner android:id="@+id/my_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 这将创建一个默认的Spinner控件。 4. 在MainActivity.java文件中,添加以下代码: ``` public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener { Spinner mySpinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mySpinner = findViewById(R.id.my_spinner); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.my_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mySpinner.setAdapter(adapter); mySpinner.setOnItemSelectedListener(this); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String item = parent.getItemAtPosition(position).toString(); Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { // Do nothing } } ``` 这将创建一个适配器,将适配器绑定到Spinner控件上,并设置选择监听器以处理选择事件。 5. 在res/values目录中创建一个新的XML文件,例如“strings.xml”。 6. 在strings.xml文件中添加以下代码: ``` <string-array name="my_array"> <item>Item 1</item> <item>Item 2</item> <item>Item 3</item> </string-array> ``` 这将创建一个字符串数组,用于填充Spinner控件。 7. 运行应用程序并测试Spinner控件。 这样,您就可以在Android中使用Spinner下拉列表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值