(android) 在GridView中實現單選或多選功能

來源:互聯網
上載者:User

          最近在做項目的過程中,要用到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);}});    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.