Android開發(fā)之GridView實現(xiàn)彈出式選擇器

前段時間容客,寫了一個小項目秕铛,里面有個界面如下圖所示,之前的版本是用Spinner來做缩挑,覺得不夠拉轟但两,所以采用GridView做了一個實現(xiàn),效果還不錯供置,Mark一下谨湘。
彈出單選GridView.png
一、點擊那個底部的綠色按鈕士袄,彈出一個對話框悲关,對話框里面的內容是一個單選的GridView,關鍵代碼如下:
//add_pay就是底部那個按鈕
add_pay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog alertDialog = new AlertDialog.Builder(AddActivity.this)
                        .setView(getChoiceView(2))
                        .create();

                alertDialog.show();
            }
        });

上面的重點是那個getChoiceView(2)娄柳,因為我有好幾個數(shù)據源寓辱,所以就用一個int類型參數(shù)的type來區(qū)分一下,不同的type取不同的數(shù)據源展示赤拒。

二秫筏、getChoiceView方法,主要是加載布局挎挖,初始化GridView这敬,然后設置Adapter和點擊事件,比較簡單蕉朵,關鍵代碼如下:
   private View getChoiceView(final int type) {

        //R.layout.dialog_choice就是GridView所在的那個布局崔涂,下面有介紹
        View view = LayoutInflater.from(AddActivity.this).inflate(R.layout.dialog_choice, null);
        GridView gv = (GridView) view.findViewById(R.id.gv);
        //GridView的數(shù)據源,直接從strings.xml中加載過來
        List<String> data; 
        //自定義適配器
        final MyAdapter adapter;
        //判斷類型始衅,加載數(shù)據源設置Adapter
        if (type == 1) {
            data = Arrays.asList(getResources().getStringArray(R.array.event));
            adapter = new MyAdapter(this, data);
            gv.setAdapter(adapter);
            //設置默認選中
            adapter.changeState(eventSelected);
        } else {
            data = Arrays.asList(getResources().getStringArray(R.array.pay));
            adapter = new MyAdapter(this, data);
            gv.setAdapter(adapter);
            adapter.changeState(paySelected);
        }

        //監(jiān)聽點擊事件冷蚂,點擊以后缭保,之前的選中應該變?yōu)槲催x中
        gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (type == 1) {
                    eventSelected = position;
                    //將選擇的內容設置到底部的按鈕上去
                    add_event.setText(eventArray.get(position).toString());
                } else {
                    paySelected = position;
                    add_pay.setText(payArray.get(position).toString());
                }
                alertDialog.dismiss();
                adapter.changeState(position);
            }
        });
        return view;
    }
三、dialog_choice 與 choice_item布局蝙茶,非常簡單

GridView所在的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="vertical">

    <GridView
        android:id="@+id/gv_choice"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:horizontalSpacing="15dp"
        android:listSelector="@color/transparent"
        android:numColumns="2" //2列
        android:verticalSpacing="15dp"></GridView>

</LinearLayout>

GridView中每個item的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_choice"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:button="@null"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:textColor="@color/white" />

</LinearLayout>
四艺骂、MyAdapter繼承自BaseAdapter,關鍵是弄一個記錄選中與否的ArrayList隆夯,默認初始化的時候都是未選中钳恕,然后設置一個方法能修改選中項,在getView中根據選中與否蹄衷,來設置背景色
@Override
public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.choice_item, null);
            viewHolder.title = (TextView) convertView.findViewById(R.id.tv_choice);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (!"".equals(data.get(position))) {
            viewHolder.title.setText(data.get(position));
        }
        if (list.get(position) == true) {
            viewHolder.title.setBackgroundDrawable(activity.getResources()
                    .getDrawable(R.drawable.choice_item_bg_selected));
        } else {
            viewHolder.title.setBackgroundDrawable(activity.getResources()
                    .getDrawable(R.drawable.choice_item_bg_default));
        }


        return convertView;
}

  /**
     * 修改選中時的狀態(tài)
     *
     * @param position
     */
public void changeState(int position) {
        if (lastPosition != -1) {
            list.set(lastPosition, false);// 取消上一次的選中狀態(tài)
        }
        list.set(position, !list.get(position));// 設置這一次的選中狀態(tài)
        lastPosition = position; // 記錄本次選中的位置
        notifyDataSetChanged(); // 通知適配器進行更新
}

最終效果
演示.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末忧额,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宦芦,更是在濱河造成了極大的恐慌宙址,老刑警劉巖轴脐,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件调卑,死亡現(xiàn)場離奇詭異,居然都是意外死亡大咱,警方通過查閱死者的電腦和手機恬涧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碴巾,“玉大人溯捆,你說我怎么就攤上這事∠闷埃” “怎么了提揍?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煮仇。 經常有香客問我劳跃,道長,這世上最難降的妖魔是什么浙垫? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任刨仑,我火速辦了婚禮,結果婚禮上夹姥,老公的妹妹穿的比我還像新娘杉武。我一直安慰自己,他們只是感情好辙售,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布轻抱。 她就那樣靜靜地躺著,像睡著了一般旦部。 火紅的嫁衣襯著肌膚如雪祈搜。 梳的紋絲不亂的頭發(fā)上封拧,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音夭问,去河邊找鬼泽西。 笑死,一個胖子當著我的面吹牛缰趋,可吹牛的內容都是我干的捧杉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秘血,長吁一口氣:“原來是場噩夢啊……” “哼味抖!你這毒婦竟也來了?” 一聲冷哼從身側響起灰粮,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仔涩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粘舟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熔脂,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年柑肴,在試婚紗的時候發(fā)現(xiàn)自己被綠了霞揉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡晰骑,死狀恐怖适秩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情硕舆,我是刑警寧澤秽荞,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站抚官,受9級特大地震影響扬跋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜耗式,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一胁住、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刊咳,春花似錦彪见、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春酵镜,著一層夾襖步出監(jiān)牢的瞬間碉碉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工淮韭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垢粮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓靠粪,卻偏偏與公主長得像蜡吧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子占键,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容