美文网首页Android黑科技安卓
安卓城市列表选择(仿美团效果)

安卓城市列表选择(仿美团效果)

作者: 大叔不秃 | 来源:发表于2019-07-11 14:53 被阅读0次

    给大家分享一个很实用的城市选择列表,城市列表估计大家都很熟悉,在此记录一下

    效果图 效果图.gif

    城市数据在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);
        }
    
        /**
         * 设置悬浮的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);
        }
    
    }
    
    

    二、实现类的关键部分

        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());
                //上个首字母,如果不存在设为""
                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

    相关文章

      网友评论

        本文标题:安卓城市列表选择(仿美团效果)

        本文链接:https://www.haomeiwen.com/subject/tryrkctx.html