Android Spinner的ArrayAdapter和SpinnerAdapter注意事项

简介: Android Spinner的ArrayAdapter和SpinnerAdapter注意事项如图所示:代码:package com.
Android Spinner的ArrayAdapter和SpinnerAdapter注意事项


如图所示:



代码:

package com.example.spinnerdemo;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		String[] start = { "北京", "上海", "成都", "其他" };
		String[] target = { "北京", "上海", "成都", "其他" };

		Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
		spinner1.setAdapter(new MyAdapter1(this,
				android.R.layout.simple_list_item_1, android.R.id.text1, start));

		Spinner spinner2 = (Spinner) findViewById(R.id.spinner2);
		spinner2.setAdapter(new MyAdapter2(this,
				android.R.layout.simple_list_item_1, android.R.id.text1, target));
	}

	private class MyAdapter1 extends ArrayAdapter {

		private LayoutInflater infalter;
		private String[] start;
		private int resource;
		private int textViewResourceId;

		public MyAdapter1(Context context, int resource,
				int textViewResourceId, String[] objects) {
			super(context, resource, textViewResourceId, objects);
			
			this.start = objects;
			this.resource = resource;
			this.textViewResourceId = textViewResourceId;
			
			infalter = LayoutInflater.from(context);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null)
				convertView = infalter.inflate(resource, null);
			TextView text = (TextView) convertView
					.findViewById(textViewResourceId);
			text.setText("pos:"+position);
			return convertView;
		}

		@Override
		public int getCount() {
			return start.length;
		}
	}

	private class MyAdapter2 extends ArrayAdapter {

		private LayoutInflater infalter;
		private int resource;
		private int textViewResourceId;

		private String[] target;

		public MyAdapter2(Context context, int resource,
				int textViewResourceId, String[] objects) {
			super(context, resource, textViewResourceId, objects);
			
			this.resource = resource;
			this.textViewResourceId = textViewResourceId;
			target = objects;
			
			infalter = LayoutInflater.from(context);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null)
				convertView = infalter.inflate(resource, null);
			TextView text = (TextView) convertView
					.findViewById(textViewResourceId);
			text.setText("选择了:" + target[position]);
			text.setBackgroundColor(Color.GREEN);
			return convertView;
		}

		@Override
		public View getDropDownView(int position, View convertView,
				ViewGroup parent) {
			if (convertView == null)
				convertView = infalter.inflate(
						android.R.layout.simple_list_item_1, null);
			TextView text = (TextView) convertView
					.findViewById(android.R.id.text1);
			text.setText(target[position]);
			text.setBackgroundColor(Color.RED);
			return convertView;
		}

		@Override
		public int getCount() {
			return target.length;
		}
	}
}


布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context="com.example.spinnerdemo.MainActivity" >

    <Spinner
        android:id="@+id/spinner1"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Spinner
        android:id="@+id/spinner2"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


注意事项:

(1)如果只是使用Android Spinner实现一个表现简单的下拉选项,那么可以直截了当的根据布局文件、数据源构造一个完备的Android Spinner,比如:new ArrayAdapter(this,android.R.layout.simple_list_item_1,android.R.id.text1,data);
new出来的,android Spinner下拉列表中的数据和选中框的数据及view完全一致。这也是Android Spinner最常用的使用场景。
(2)在adapter中,getView负责创建Spinner的选择框选中的item的view呈现,即上图中“pos1”和绿色背景的“选择了:成都”这些view,而getDropDownView则创建下拉选项列表中各个子item的view和数据的创建。两者分工不同,在本例中结合最终的View结合spinner1和spinner2所对应的两个不同adapter代码对比。
在MyAdapter1中,没有实现getDropDownView,但是通过MyAdapter1在构造函数时候接收到完整的资源布局文件、数据源,那么Android自动将下拉列表中的数据从构造中获得的数据渲染下拉列表中的数据。但是由于代码重写了getView,那么选中框将根据getView表现。
(3)使用ArrayAdapter作为Spinner的适配器时候,如果在ArrayAdapter中构造时候不传递过去完整的布局文件、数据源,比如这样构造适配器:new MyArrayAdapter(this,-1),并且不在ArrayAdapter内部实现getDropDownView,则会引起Spinner代码崩溃,原因是因为Spinner会自动加载适配器中的默认构造,进而,如果传递过去的是null,则下拉列表无法正确加载,进而导致代码崩溃。
相关文章
|
6月前
|
前端开发 Android开发 Windows
27. 【Android教程】下拉选择框 Spinner
27. 【Android教程】下拉选择框 Spinner
237 2
|
5月前
|
Android开发
Android面试题之自定义View注意事项
在Android开发中,自定义View主要分为四类:直接继承View重写onDraw,继承ViewGroup创建布局,扩展特定View如TextView,以及继承特定ViewGroup。实现时需注意:支持wrap_content通过onMeasure处理,支持padding需在onDraw或onMeasure/onLayout中处理。避免在View中使用Handler,使用post系列方法代替。记得在onDetachedFromWindow时停止线程和动画以防止内存泄漏。处理滑动嵌套时解决滑动冲突,并避免在onDraw中大量创建临时对象。
62 4
|
7月前
|
XML Java Android开发
Android spinner 的使用
Android spinner 的使用
143 6
|
7月前
|
XML Android开发 数据格式
关于Android中Spinner的使用
关于Android中Spinner的使用
108 1
|
Android开发
Android 中使用spinner实现下拉列表的两种方法和getItemAtPosition()方法的使用
Android 中使用spinner实现下拉列表的两种方法和getItemAtPosition()方法的使用
244 0
|
7月前
|
XML Java Android开发
Android Studio App开发中高级控件下拉列表Spinner的讲解及实战(附源码 超详细必看)
Android Studio App开发中高级控件下拉列表Spinner的讲解及实战(附源码 超详细必看)
354 0
|
Java 程序员 Android开发
C++ 程序员,安卓开发注意事项
C++ 程序员,安卓开发注意事项
|
XML 缓存 数据库
Android桌面小部件开发,及注意事项
Android桌面小部件开发,及注意事项
497 0
|
Android开发
关于安卓aab打包生成apks注意事项
关于安卓aab打包生成apks注意事项
354 0
|
存储 IDE 编译器
Android C++系列:函数返回值注意事项
函数返回值就是使用return语句终止正在执行的函数,看是很简单的问题有什么说的呢?因为越是简单的问题里面越是有一些不易发现的坑。
104 0