一、Spinner

概念;下拉菜单控件 默认显示当前选择的项(第一次展示集合中第一条数据)

属性:


android:entries="@array/books"  展示数据  (note:提前知道数据是什么 )


        android:spinnerMode="dropdown" spinner 样式


        dropdown:下拉列表     设置popupBackground  每一项的背景颜色


        dialog:弹出框              设置prompt   标题      调用的是Values/string.xml/string  




       监听:setOnItemSelectedListener


例题:


import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemSelectedListener;

import android.widget.Spinner;

import android.widget.Toast;


public class MainActivity extends Activity {

    private Spinner spinner;



    @Override


    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        spinner = (Spinner) findViewById(R.id.spinner);
       
        //给spinner设置监听   OnItemSelectedListener
        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        /**

         * 那个条目被选中     

         *  AdapterView<?> parent:监听器下拉列表对象
  
         *  View view:     当前被选中的view

	     *int position:         被选中的条目的
		 *long id; 被选中的条目的id   

     	 *       

  	     */	

	    @Override

		public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {			
                        
				     //获取资源里的字符串数组
				     String[] books = getResources().getStringArray(R.array.books);
	                 String info= books[position];				
			        Toast.makeText(MainActivity.this, "您选择的是:"+info, Toast.LENGTH_SHORT).show();
			}			

            /**			

            * 数据被清除时调用:(一般不使用)			 

            */			

           @Override

			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub				
			}		

       });
    }
   

 @Override    

public boolean onCreateOptionsMenu(Menu menu) { 

       // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu); 

        return true;
    }
    
}





二、什么是Adapter?

适配器  将数据转换成控件识别的形式

子类:BaseAdapter    ArrayAdapter     SimpleAdapter



       ArrayAdapter的使用?


一般用于只有String类型数据  展示到TextView上


如果三个参数的ArrayAdapter   item布局的根节点 必须是TextView


        如果跟节点不是TextVIew 三个参数的会报错      使用四个参数的ArrayAdapter



例题:


public class MainActivity extends Activity {

	private Spinner spinner;
	private String[] data;
	private ArrayAdapter<String> adapter;
	

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //1,得到控件
        spinner = (Spinner) findViewById(R.id.spinner);
        
        //2,获取数据源
        data = new String[]{"java","C","Html","C++"};
        
        //3,获取Adapter对象
        /**
         * 参数1:上下文
         * 参数2:每个item 的布局
         * 参数3:数据源
         */
        adapter  = new ArrayAdapter<String>(MainActivity.this,
        						android.R.layout.simple_spinner_item, data);
        
        //4,将数据展示到 控件上
        spinner.setAdapter(adapter);
        
        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				// 方式1;
				String info1 = data[position];
				
				//方式2
				String info2 = parent.getItemAtPosition(position).toString();
				
				//方式3
				String info3 = spinner.getItemAtPosition(position).toString();
				
				//方式4
				String info4 = adapter.getItem(position);
				
				Toast.makeText(MainActivity.this, "info1:"+info1+"=info2:"+info2+"=info3:"+info3+"=info4:"+info4, Toast.LENGTH_SHORT).show();
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				// TODO Auto-generated method stub
				
			}
		});
        
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}





         SimpleAdapter的使用:


   处理复杂的数据   (带有图片和文字)


  Context context:   上下文


           List<? extends Map<String, ?>> data:  数据源


           int resource:  布局


           String[] from:  数据源中带key的数组


           int[] to     :  布局资源中id的数组


             


          【注】:from里的key和to里的控件id  是对应关系


例题:

public class MainActivity extends Activity {
	
	private Spinner spinner;
	private SimpleAdapter adapter;
	
	//数据源  
	private List<Map<String, Object>> data;
	private int[] icons = {R.drawable.img_11,R.drawable.img_12,R.drawable.img_13,
							R.drawable.img_14,R.drawable.img_15,R.drawable.img_16};
	private String[] citys= {"北京","上海","广州","深圳","台湾","澳门"};
	
	

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //1,找出控件
        spinner =  (Spinner) findViewById(R.id.spinner);
        
        //2数据源 ???
        //实例化
        data = new ArrayList<Map<String,Object>>();
        
        for(int i=0;i<icons.length;i++){
        	Map<String,Object> map = new HashMap<String, Object>();
        	map.put("icon", icons[i]);
        	map.put("city", citys[i]);
        	
        	data.add(map);
        }
        
        
        /**
         *   Context context:   上下文
         *   List<? extends Map<String, ?>> data:  数据源
             int resource:  布局
             String[] from:  数据源中带key的数组
             int[] to     :  布局资源中id的数组
             
             note:from里的key和to里的控件id  是对应关系
         */
        adapter = new SimpleAdapter(MainActivity.this, data, 
        		R.layout.item, new String[]{"icon","city"}, new int[]{R.id.iv,R.id.tv});
        
        //3,将数据展示到控件上
        spinner.setAdapter(adapter);
        
        
    }


    
}





三、AutoCompleteTextView


自动索引的EditText(文本输入框)



默认输入俩个字符  才开始索引


          android:completionThreshold="1" 输入几个字符开始索引


例题:



public class MainActivity extends Activity {
	
	private  AutoCompleteTextView autoView;
	
	private String[] data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //1,找到控件
        autoView = (AutoCompleteTextView) findViewById(R.id.autoView);
        
        //2,获取数据源 
        data = new String[]{"a","android","apple","c","c++","c#"};
        
        //获取adapter对象    目的将数据展示到对应的item上
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,
        		android.R.layout.simple_spinner_item, data);
        
        //3,将数据展示到控件上
        autoView.setAdapter(adapter);
        
        //item的点击监听
        /**
         * 参数1:用户点击控件AutoCompleteTextView
         * 参数2:用户点击的item
         * 参数3:用户所点击item的位置
         * 参数4:用户点击item的id
         * 
         */
        autoView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "===>"+data[position], Toast.LENGTH_SHORT).show();
			}
		});
        
        //文本发生变化的监听   可以对EditText操作  
        autoView.addTextChangedListener(new TextWatcher() {
			
        	/**
        	 * 改变文本时调用
        	 * CharSequence s:变化之后的文本
        	 * int start:变化的起点  从哪里开始改变
        	 * int before: 相比较文本变化  添加没有改变0     删除改变
        	 * int count:相比较文本变化     添加有值          删除没有改变0
        	 */
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO Auto-generated method stub
				Log.e("AAA", "==onTextChanged==s:"+s+"=start:"+start+"=before:"+before+"=count:"+count);
			}
			
			/**
        	 * 改变文本之前调用
        	 * CharSequence s:变化之前的文本
        	 * int start:变化之前的文本下标
        	 * int count:相比较文本的变化   添加不变的0   删除是改变:删除几个展示结果
        	 * int after:相比较文本的变化     如果添加是有值    如果删除不变   0
        	 */
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				Log.e("AAA", "==beforeTextChanged==s:"+s+"=start:"+start+"=count:"+count+"=after:"+after);
				
			}
			/**
        	 * 改变文本之后调用
        	 * Editable s:改变之后的文本
        	 */
			@Override
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				Log.e("AAA", "==afterTextChanged==s:"+s);
			}
		});
    }


    
}