安卓城市列表選擇(仿美團效果)

給大家分享一個很實用的城市選擇列表抓歼,城市列表估計大家都很熟悉讥此,在此記錄一下

效果圖
效果圖.gif

城市數(shù)據(jù)在assets下的China_cities.db文件

一拢锹、控件的測量

public class SideLetterBar extends View {
    private static final String[] b = {"定位", "熱門", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
    private int choose = -1;
    private Paint paint = new Paint();
    private boolean showBg = false;
    private OnLetterChangedListener onLetterChangedListener;
    private TextView overlay;

    public SideLetterBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SideLetterBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SideLetterBar(Context context) {
        super(context);
    }

    /**
     * 設(shè)置懸浮的textview
     * @param overlay
     */
    public void setOverlay(TextView overlay){
        this.overlay = overlay;
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (showBg) {
            canvas.drawColor(Color.TRANSPARENT);
        }

        int height = getHeight();
        int width = getWidth();
        int singleHeight = height / b.length;
        for (int i = 0; i < b.length; i++) {
            paint.setTextSize(getResources().getDimension(R.dimen.side_letter_bar_letter_size));
            paint.setColor(getResources().getColor(R.color.cp_gray));
            paint.setAntiAlias(true);
            if (i == choose) {
                paint.setColor(getResources().getColor(R.color.cp_gray_deep));
//                paint.setFakeBoldText(true);  //加粗
            }
            float xPos = width / 2 - paint.measureText(b[i]) / 2;
            float yPos = singleHeight * i + singleHeight;
            canvas.drawText(b[i], xPos, yPos, paint);
            paint.reset();
        }

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        final int action = event.getAction();
        final float y = event.getY();
        final int oldChoose = choose;
        final OnLetterChangedListener listener = onLetterChangedListener;
        final int c = (int) (y / getHeight() * b.length);

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                showBg = true;
                if (oldChoose != c && listener != null) {
                    if (c >= 0 && c < b.length) {
                        listener.onLetterChanged(b[c]);
                        choose = c;
                        invalidate();
                        if (overlay != null){
                            overlay.setVisibility(VISIBLE);
                            overlay.setText(b[c]);
                        }
                    }
                }

                break;
            case MotionEvent.ACTION_MOVE:
                if (oldChoose != c && listener != null) {
                    if (c >= 0 && c < b.length) {
                        listener.onLetterChanged(b[c]);
                        choose = c;
                        invalidate();
                        if (overlay != null){
                            overlay.setVisibility(VISIBLE);
                            overlay.setText(b[c]);
                        }
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                showBg = false;
                choose = -1;
                invalidate();
                if (overlay != null){
                    overlay.setVisibility(GONE);
                }
                break;
        }
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

    public void setOnLetterChangedListener(OnLetterChangedListener onLetterChangedListener) {
        this.onLetterChangedListener = onLetterChangedListener;
    }

    public interface OnLetterChangedListener {
        void onLetterChanged(String letter);
    }

}

二、實現(xiàn)類的關(guān)鍵部分

    public CityListAdapter(Context mContext, List<City> mCities) {
        this.mContext = mContext;
        this.mCities = mCities;
        this.inflater = LayoutInflater.from(mContext);
        if (mCities == null){
            mCities = new ArrayList<>();
        }
        mCities.add(0, new City("定位", "0"));
        mCities.add(1, new City("熱門", "1"));
        int size = mCities.size();
        letterIndexes = new HashMap<>();
        sections = new String[size];
        for (int index = 0; index < size; index++){
            //當前城市拼音首字母
            String currentLetter = PinyinUtils.getFirstLetter(mCities.get(index).getPinyin());
            //上個首字母萄喳,如果不存在設(shè)為""
            String previousLetter = index >= 1 ? PinyinUtils.getFirstLetter(mCities.get(index - 1).getPinyin()) : "";
            if (!TextUtils.equals(currentLetter, previousLetter)){
                letterIndexes.put(currentLetter, index);
                sections[index] = currentLetter;
            }
        }
    }

最后給出demo的地址卒稳,歡迎大家訪問和使用。
https://gitee.com/oubajunping/chengshixuanzeliebiao

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末他巨,一起剝皮案震驚了整個濱河市充坑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌染突,老刑警劉巖捻爷,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異份企,居然都是意外死亡也榄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門司志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來手蝎,“玉大人,你說我怎么就攤上這事俐芯。” “怎么了钉鸯?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵吧史,是天一觀的道長。 經(jīng)常有香客問我唠雕,道長贸营,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任岩睁,我火速辦了婚禮钞脂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捕儒。我一直安慰自己冰啃,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布刘莹。 她就那樣靜靜地躺著阎毅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪点弯。 梳的紋絲不亂的頭發(fā)上扇调,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音抢肛,去河邊找鬼狼钮。 笑死碳柱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的熬芜。 我是一名探鬼主播莲镣,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猛蔽!你這毒婦竟也來了剥悟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤曼库,失蹤者是張志新(化名)和其女友劉穎区岗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毁枯,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡慈缔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了种玛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藐鹤。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赂韵,靈堂內(nèi)的尸體忽然破棺而出娱节,到底是詐尸還是另有隱情,我是刑警寧澤祭示,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布肄满,位于F島的核電站,受9級特大地震影響质涛,放射性物質(zhì)發(fā)生泄漏稠歉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一汇陆、第九天 我趴在偏房一處隱蔽的房頂上張望怒炸。 院中可真熱鬧,春花似錦毡代、人聲如沸阅羹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灯蝴。三九已至,卻和暖如春孝宗,著一層夾襖步出監(jiān)牢的瞬間穷躁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留问潭,地道東北人猿诸。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像狡忙,于是被迫代替她去往敵國和親梳虽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 每日一報4. 24 姓 名:89阿喵 原 始 體 重:116.4斤 昨天早上體重:109.2斤 昨天晚上體重:...
    文俊zh閱讀 173評論 0 0
  • 今天我和老公還有堂表姐一起去參加堂妹的婚禮灾茁。堂妹家在農(nóng)村窜觉,但堂叔和堂嬸都是每個月拿著國家工資的退休人員。在農(nóng)村有幾...
    梧桐落雨L閱讀 628評論 1 1
  • 初秋的夜晚變得很靜謐北专,再加上雨兒輕輕飄舞著禀挫,似乎感覺有一點寒意了! 夜晚的月亮在烏云之上拓颓,時而露出短暫的嘴角语婴。烏云...
    大龍蛋閱讀 316評論 0 0
  • 01 我有一個朋友的女兒砰左,今年念高二。朋友一直很苦惱场航,在他看來缠导,自己的女兒又聽話,又勤奮溉痢,為什么成績總是平平酬核,老提...
    蝸牛等花開閱讀 642評論 0 2
  • 從京那里聽說,萬獅國的精英學(xué)院準備接收比洛斯的事情适室,信智開始有些忐忑起來。雖然無論怎么說举瑰,讓比洛斯去精英學(xué)...
    光火君閱讀 349評論 1 2