最近在做項目的過程中,要用到GridView,同時還得使用單選或多選功能,在網上搜過很多資源貼,但都不是我想要的效果,於是就自行設計了一種方案。什麼都不說,先上個^_^: Demo原始碼下載:http://download.csdn.net/down/3435752/anndaming
首先需要構建一個ImageAdapter類,此類繼承了BaseAdapter類,用於做GridView中資源的適配器,代碼如下:
package com.demo;import java.util.Vector;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.graphics.drawable.LayerDrawable;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;public class ImageAdapter extends BaseAdapter{ private Context mContext;// 定義Context private Vector<Integer> mImageIds = new Vector<Integer>();// 定義一個向量作為圖片源 private Vector<Boolean> mImage_bs = new Vector<Boolean>();// 定義一個向量作為選中與否容器 private int lastPosition = -1;//記錄上一次選中的圖片位置,-1表示未選中任何圖片 private boolean multiChoose;//表示當前適配器是否允許多選 public ImageAdapter(Context c, boolean isMulti){ mContext = c; multiChoose = isMulti; // 裝入資源 mImageIds.add(R.drawable.item1); mImageIds.add(R.drawable.item2); mImageIds.add(R.drawable.item3); mImageIds.add(R.drawable.item4); mImageIds.add(R.drawable.item5); for(int i=0; i<5; i++) mImage_bs.add(false); } @Overridepublic int getCount() {// TODO Auto-generated method stubreturn mImageIds.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stub return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubImageView imageView; if (convertView == null) { imageView = new ImageView(mContext);// 給ImageView設定資源 imageView.setLayoutParams(new GridView.LayoutParams(50, 50));// 設定布局圖片 imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);// 設定顯示比例類型 } else { imageView = (ImageView) convertView; } imageView.setImageDrawable(makeBmp(mImageIds.elementAt(position), mImage_bs.elementAt(position))); return imageView;}private LayerDrawable makeBmp(int id, boolean isChosen){Bitmap mainBmp = ((BitmapDrawable)mContext.getResources().getDrawable(id)).getBitmap();// 根據isChosen來選取對勾的圖片 Bitmap seletedBmp; if(isChosen == true) seletedBmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.btncheck_yes); else seletedBmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.btncheck_no); // 產生疊加圖 Drawable[] array = new Drawable[2]; array[0] = new BitmapDrawable(mainBmp); array[1] = new BitmapDrawable(seletedBmp); LayerDrawable la = new LayerDrawable(array); la.setLayerInset(0, 0, 0, 0, 0); la.setLayerInset(1, 0, -5, 60, 45 ); return la;//返回疊加後的圖 }// 修改選中的狀態 public void changeState(int position){ // 多選時 if(multiChoose == true){ mImage_bs.setElementAt(!mImage_bs.elementAt(position), position);//直接取反即可 } // 單選時 else{ if(lastPosition != -1) mImage_bs.setElementAt(false, lastPosition);//取消上一次的選中狀態 mImage_bs.setElementAt(!mImage_bs.elementAt(position), position);//直接取反即可 lastPosition = position;//記錄本次選中的位置 } notifyDataSetChanged();//通知適配器進行更新 }}
接下是配置main.xml檔案:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><LinearLayout android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="wrap_content" android:gravity="center_horizontal"><TextView android:text="單選功能"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="40dp"android:gravity="center"/> <GridView android:id="@+id/gridview_radio" android:layout_width="250dp" android:layout_height="150dp" android:numColumns="4" android:padding="10dp" android:horizontalSpacing="4dp" android:verticalSpacing="4dp" android:gravity="center"/> </LinearLayout> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="wrap_content" android:gravity="center_horizontal"><TextView android:text="多選功能"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="40dp"android:gravity="center"/> <GridView android:id="@+id/gridview_check" android:layout_width="250dp" android:layout_height="150dp" android:numColumns="4" android:padding="10dp" android:horizontalSpacing="4dp" android:verticalSpacing="4dp" android:gravity="center"/> </LinearLayout></LinearLayout>
最後寫一個Activity作測試:
package com.demo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.GridView;import android.widget.AdapterView.OnItemClickListener;public class DemoActivity extends Activity {GridView gridView_radio;//單選宮格GridView gridView_check;//多選宮格ImageAdapter ia_radio;//儲存圖片源的適配器(單選)ImageAdapter ia_check;//儲存圖片源的適配器(多選) /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 單選的宮格 gridView_radio = (GridView) findViewById(R.id.gridview_radio); ia_radio = new ImageAdapter(this, false); gridView_radio.setAdapter(ia_radio); // 設定點擊監聽 gridView_radio.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3) {// TODO Auto-generated method stubia_radio.changeState(position);}}); // 多選的宮格 gridView_check = (GridView) findViewById(R.id.gridview_check); ia_check = new ImageAdapter(this, true); gridView_check.setAdapter(ia_check); // 設定點擊監聽 gridView_check.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3) {// TODO Auto-generated method stubia_check.changeState(position);}}); }}