关闭

Android Spinner的ArrayAdapter和SpinnerAdapter注意事项

标签: android
5154人阅读 评论(0) 收藏 举报
分类:
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,则下拉列表无法正确加载,进而导致代码崩溃。
1
0
查看评论

Android SpinnerAdapter 的使用

上一篇写了最基本的adapter,接下来就一层层的往上走吧,这次介绍下SpinnerAdapter的使用。 SpinnerAdapter是和Spinner结合使用,显示下拉列表。现在开始吧。 一、public interface SpinnerAdapter extends Adapter{} ...
  • u012077817
  • u012077817
  • 2015-11-10 15:17
  • 4076

Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

今天学习了Spinner组件,使用Spinner相当于从下拉列表中选择项目,下面演示一下Spinner的使用(分别使用ArrayAdapter和自定义Adapter实现) (一):使用ArrayAdapter进行适配数据:    ①:首先定义一个布局文件: <Linea...
  • jiangqq781931404
  • jiangqq781931404
  • 2012-02-23 09:09
  • 34618

Spinner与适配器Adapter使用总结

Spinner的使用离不开和Adapter结合使用,下面将基本的常用法介绍一下,主要还是为初学者提供些帮助 第一步:创建布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu...
  • TTS_Kevin
  • TTS_Kevin
  • 2012-04-17 11:38
  • 14802

Android Spinner的ArrayAdapter和SpinnerAdapter注意事项

注:原博客:http://blog.csdn.net/zhangphil 《Android图片加载与缓存开源框架:Android Glide》 Android Glide是一个开源的图片加载和缓存处理的第三方框架。和Android的Picasso库类似,个人感觉比Android Pi...
  • zhangli_
  • zhangli_
  • 2015-11-19 15:44
  • 593

在android的spinner中,实现取VALUE值和ID值

spinner绑定数据源可以是.xml文件绑定,也可以是字符串数组绑定,但是我在网上找到的都是只能单个字符串拉上去,没有可以自定义的ID来识别; 这让很多的事情都不好办,比如说从数据库中提取的ID和String,不能自动的绑定上去 为了实现在android的spinner实现取VALUE...
  • shichg
  • shichg
  • 2012-10-23 17:28
  • 5156

Spinner 设置适配器, adapter

spinner 数据源可以来自xml,但是用的最多还是通过adapter跟spinner绑定数据第一种:通过xml获得数据源: <Spinner android:id="@+id/spinner1" android:layo...
  • SpRcorder
  • SpRcorder
  • 2016-09-18 13:42
  • 678

spinner自定义adapter

  • 2016-12-08 11:09
  • 6.76MB
  • 下载

Spinner 之 使用SimpleAdapter 填充数据

适用场景    图文混排,图片来自本地 数据源    List> 步骤:    1, 控件,  得到控件并且初始化 2, 得到数据源 3, 得到适配器 4, 为控件设置...
  • nkdwslsd
  • nkdwslsd
  • 2016-08-27 16:36
  • 935

Android开发适配器系列:Spinner绑定ArrayAdapter适配器

1、什么是Spinner Spinners 提供了一个快速的方式从一个集合中选择一个选项,默认情况Spinner显示当前选中的值,我们也可以通过spinner.setSelection(position);语句来设置Spinner选中的值。点击Spinner会弹出一个显示可供选择的下拉列表菜单,用户...
  • a13429921973
  • a13429921973
  • 2013-10-10 09:33
  • 5593

ArrayAdapter参数的理解

转载:http://www.cnblogs.com/lewisky/p/5017052.html 1.   适配器的作用是数据和视图之间的桥梁 2.   要显示一个数组,我们就用ArrayAdapter,数组适配器,数据的数据类型 3.    ...
  • Hello___A__World
  • Hello___A__World
  • 2017-04-22 16:47
  • 2328
    个人资料
    • 访问:1621228次
    • 积分:21108
    • 等级:
    • 排名:第446名
    • 原创:566篇
    • 转载:13篇
    • 译文:2篇
    • 评论:326条
    关于我
    邮箱: zhangphil@live.com
    博客专栏