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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章