AdapterTest

 

 AdapterTestActivity.java

package hyz.com.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class AdapterTestActivity extends Activity implements OnItemClickListener,OnItemSelectedListener
{
	private static final Integer[] strs = {R.string.str1,R.string.str2,R.string.str3};
	private static final Integer[] imgs = {R.drawable.img1,R.drawable.img2,R.drawable.img3};	

	private ListView listView;
	private Spinner spinner;	
	private Gallery gallery;
	private GridView gridView;	
	/*
	 * ArrayAdapter数组适配器,它的作用就是一个数组和listview之间的桥梁,
	 * 它可以将数组里边定义的数据一一对应的显示在Listview里边。 
	 * ListView的每个TextView里边显示的内容就是数组里边的对象调用toString()方法后生成的字符串。 
	 */
	private ArrayAdapter<String> arrayAdapter;
	private List<Map<String,Object>> arrayList;
	private SimpleAdapter simpleAdapter;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        listView = (ListView)findViewById(R.id.myListView); 
        spinner = (Spinner)findViewById(R.id.mySpinner);      
        gridView = (GridView)findViewById(R.id.myGridView);
        gallery = (Gallery)findViewById(R.id.myGallery);
        
        arrayList = new ArrayList<Map<String, Object>>();    	
        for (int i = 0; i < strs.length; i++) 
        {    
        	Map<String, Object> map = new HashMap<String, Object>();
        	/*
        	 * 探索了半天,通过id来映射资源貌似只能用下面的方法
        	 * 如里不用id,可以这样写:
        	 * map.put("str","字符串");
        	 * map.put("img",R.drawable.img1);
        	 * 不过这样写就不能用for循环了  
        	 */
        	map.put("str",getResources().getString(strs[i]));
        	map.put("img",imgs[i]);           
        	arrayList.add(map);
        }        
        //下面的适配器可以互相使用来显示效果
        spinner.setAdapter(getSimpleAdapter(this));  
        spinner.setOnItemSelectedListener(this);
        
        gridView.setAdapter(new GridAdapter(this)); 
        gridView.setOnItemClickListener(this);        
   
        listView.setAdapter(new MyListAdapter(this));
        listView.setOnItemClickListener(this);    
        
        gallery.setAdapter(new GalleryAdapter(this));
       
     }  
    //这是一个SimpleAdapter,适配了图片和字符串
    public SimpleAdapter getSimpleAdapter(Context context)
    {    
        simpleAdapter = new SimpleAdapter(getApplicationContext(), arrayList, R.layout.list_main,
        		new String[]{"str","img"}, new int[]{R.id.tv,R.id.iv});      
        return simpleAdapter;
    } 
    
	public ArrayAdapter<String> getArrayAdapter(Context context)
    {  
		/*
		 * android系统默认提供了很多默认的布局方式,也可以自定义。 
         * android.R.layout.simple_list_item_1:每一项只有一个TextView 
         * android.R.layout.simple_list_item_2:每一项有两个TextView 
         * android.R.layout.simpte.list_item_single_choice,每一项有一个TextView,但是这一项可以被选中。
         * android.R.layout.simple_expandable_list_item_1:每一项只有一个TextView 	 	 
		 */
//		 第一种ArrayAdapter,除了上面系统自带的布局,还可以使用自定义xml,
//		 但这xml只能有一个textView,连开头的LinearLayout都不能有.
//		 每一个add(),相当给ListView增加一个列表项,系统都会把add里的值放在typedef.xml里的TextView
		/*
		 *arrayAdapter = new ArrayAdapter(this, R.layout.typedef);  
		 *arrayAdapter.add("1"); 
		 *arrayAdapter.add("2");   
		 *arrayAdapter.add("3");
		 */
        // 第二种ArrayAdapter ,如果上面的自定义布局还需要显示其它组件,可用下面的形式。
     	//每一个add,系统会把值放在typedef1里的id为textview的TextView
        arrayAdapter = new ArrayAdapter<String>(this, R.layout.list_main, R.id.tv);     
        arrayAdapter.add("arrayAdapter1");    
        arrayAdapter.add("arrayAdapter2");    
        arrayAdapter.add("arrayAdapter3"); 
       //第三种,就是自定义类继承BaseAdapter,相当于下面的MyListAdapter 
		return arrayAdapter;
    }
    class ViewHolder
    {
    	ImageView imageView;
    	TextView textView;
    }
   //BaseAdapter主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件
    class MyListAdapter extends BaseAdapter
    {	   	 
	   	 private LayoutInflater inflater;	   	 
	   	 private ViewHolder holder;
		 public MyListAdapter(Context context) 
		 {			 	
		 	 inflater = LayoutInflater.from(context);
		 }	
		 @Override
		 public int getCount() 
		 {
			return strs.length;
		 }
		@Override
		public Object getItem(int position) 
		{
			return position;
		}
		@Override
		public long getItemId(int position) 
		{
			return position;
		}      
	     /*
	      * listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到 listView的长度,
	      * 然后根据这个长度,调用getView()逐一绘制每一行。系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。
	      * 当手动完成适配时,必须手动映射数据,这需要重写getView()方 法。系统在绘制列表的每一行的时候将调用此方法。
	      * getView()有三个参数,position表示将显示的是第几行,位置从0开始;covertView是从布局文 件中inflate来的布局,
	      * 是Spinner,ListView中每一项要显示的view,通常return 的view也就是convertView;
	      * parent就是父窗体了,也就是Spinner,ListView,GridView.
	      * 我们用LayoutInflater的方法将定义好的item.xml文件提取成View实例用来显示。
	      * 然后将xml文件中 的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。
	      */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) 
		{
			/*
			 * LayoutInflater是用来找layout下xml布局文件,并且实例化!
			 * 而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
			 * 下面俩种方法都可以 
            * 1、LayoutInflater inflater = getLayoutInflater();
            * 2、 LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
			 */
			if (convertView == null)
			{				
				convertView = inflater.inflate(R.layout.list_main, null);
				holder = new ViewHolder();
				holder.imageView = (ImageView) convertView.findViewById(R.id.iv);
				holder.textView = (TextView) convertView.findViewById(R.id.tv);			
				convertView.setTag(holder);
			}
			else 
			{
				holder = (ViewHolder) convertView.getTag();
			}					
			holder.textView.setText(strs[position]); // 设置字符串
			holder.imageView.setBackgroundResource(imgs[position]); // 设置图标			
			return convertView;
		}
    }
	class GridAdapter extends BaseAdapter 
 	{ 	
 		private Context mContext;		
 		public GridAdapter(Context mContext)
 		{
 			this.mContext = mContext;
 		}		
 		public int getCount()
 		{
 			return strs.length;
 		}
 		public Object getItem(int position)
 		{
 			return position;
 		}
 		public long getItemId(int position) 
 		{
 			return position;
 		}
 		public View getView(int position, View convertView, ViewGroup parent)
 		{
 			TextView textView = new TextView(mContext); 			
 			Drawable ico = getResources().getDrawable(imgs[position]);
 			//图片在这个textView出现的上、下、左、右位置
 			textView.setCompoundDrawablesWithIntrinsicBounds(null, ico, null, null);
 			textView.setText(strs[position]);
 			
 		    //文字的位置
 			textView.setGravity(Gravity.CENTER); 			
 			//textView.setHeight(100);
 			return textView;
 		}
 	}	
	class GalleryAdapter extends BaseAdapter 
 	{ 	
 		private Context mContext;		
 		public GalleryAdapter(Context mContext)
 		{
 			this.mContext = mContext;
 		}		
 		public int getCount()
 		{
 			return strs.length;
 		}
 		public Object getItem(int position)
 		{
 			return position;
 		}
 		public long getItemId(int position) 
 		{
 			return position;
 		}
 		public View getView(int position, View convertView, ViewGroup parent)
 		{ 			
 			ImageView view = new ImageView(mContext);
 			view.setImageResource(imgs[position]);
 			view.setLayoutParams(new Gallery.LayoutParams(80,80));
 			//设置ImageView的拉升类型,这里采用居中,您可以尝试不同的类型
 			view.setScaleType(ImageView.ScaleType.FIT_CENTER);
 			return view;
 		}
 	}
	//网格布局或ListView每一格或每一列的监听事件(从左到右或从上到下position=0,1,2)
 	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
	{	
		switch(position)
		{
		case 0:	 Toast.makeText(this, "第一个位置", Toast.LENGTH_SHORT).show();break;
		case 1:  Toast.makeText(this, "第二个位置", Toast.LENGTH_SHORT).show();break;
		case 2:	 Toast.makeText(this, "第三个位置", Toast.LENGTH_SHORT).show();break;
		default: Toast.makeText(this, "其它位置", Toast.LENGTH_SHORT).show();break;			
		}		
	}
 	//下面两个函数是Spinner下拉列表的监听事件	
	public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
	{
		switch(arg2)
		{
		case 0:	 Toast.makeText(this, "第一个位置", Toast.LENGTH_SHORT).show();break;
		case 1:  Toast.makeText(this, "第二个位置", Toast.LENGTH_SHORT).show();break;
		case 2:	 Toast.makeText(this, "第三个位置", Toast.LENGTH_SHORT).show();break;
		default: Toast.makeText(this, "其它位置", Toast.LENGTH_SHORT).show();break;			
		}		
	}		
	public void onNothingSelected(AdapterView<?> arg0) 
	{			
	} 
}


 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <Spinner 
        android:id="@+id/mySpinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <ListView 
        android:id="@+id/myListView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <Gallery 
        android:id="@+id/myGallery"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
 <GridView
  android:id="@+id/myGridView"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:numColumns="3"/>
</LinearLayout>
 

list_main.xml

<?xml version="1.0" encoding="utf-8"?>    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:background="#aa0000"> 
    <TextView 
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#0000aa"/>
    <ImageView 
        android:id="@+id/iv"
        android:layout_width="40dip"
        android:layout_height="40dip"/>    
</LinearLayout> 
 
typedef.xml
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android"   
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:background="#0000FF"  
     >   
</TextView> 

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>  
    <string name="app_name">TypedefSpinnerTest</string>
    <string name="str1">选项1</string>
    <string name="str2">选项2</string>
    <string name="str3">选项3</string>
 </resources>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值