SideBar 选择城市时右侧边上的 选择bar

需要定义一个SideBar的视图类  在布局文件中引用   同时在布局中设置一个textView默认不可见

当触摸时才显示   在调用的Activity中

sideBar.setOnTouchingLetterChangedListener方法离开时不可见   同时联动listView  listView.setSelection(i)设置联动;

  1 package com.archie.lazyhousewifery.cityandauntdetail.makeview;
  2
  3 import android.content.Context;
  4 import android.graphics.Canvas;
  5 import android.graphics.Color;
  6 import android.graphics.Paint;
  7 import android.util.AttributeSet;
  8 import android.view.MotionEvent;
  9 import android.view.View;
 10 import android.widget.TextView;
 11
 12 import com.archie.lazyhousewifery.cityandauntdetail.Constants;
 13
 14 public class SideBar extends View {
 15
 16     public String[] characters = new String[] { "#", "A", "B", "C", "D", "E", "F",
 17             "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
 18             "X", "Y", "Z" };
 19
 20     private Paint paint;
 21     private int textSize = 16;
 22     private int defaultTextColor = Color.parseColor("#D2D2D2");
 23     private int selectedTextColor = Color.parseColor("#2DB7E1");
 24     private int touchedBgColor = Color.parseColor("#F5F5F5");
 25     private TextView  text_dialog;
 26
 27     private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
 28
 29     private int position = -1;
 30
 31     public SideBar(Context context) {
 32         super(context);
 33     }
 34
 35     public SideBar(Context context, AttributeSet attrs) {
 36         super(context, attrs);
 37         init();
 38     }
 39
 40     public SideBar(Context context, AttributeSet attrs, int defStyle) {
 41         super(context, attrs, defStyle);
 42         init();
 43     }
 44
 45     public void setTextDialog(TextView textView){
 46         this.text_dialog = textView;
 47     }
 48
 49     private void init() {
 50         paint = new Paint();
 51         paint.setAntiAlias(true);
 52     }
 53
 54     @Override
 55     protected void onDraw(Canvas canvas) {
 56         super.onDraw(canvas);
 57
 58         int height = getHeight();
 59         int width = getWidth();
 60         int singleHeight = height / characters.length;
 61
 62         for (int i = 0; i < characters.length; i++) {
 63             if (i == position) {
 64                 paint.setColor(selectedTextColor);
 65             } else {
 66                 paint.setColor(defaultTextColor);
 67             }
 68             paint.setTextSize(textSize);
 69
 70             float xPos = width / 2 - paint.measureText(characters[i]) / 2;
 71             float yPos = singleHeight * i + singleHeight;
 72             canvas.drawText(characters[i], xPos, yPos, paint);
 73         }
 74     }
 75
 76     @Override
 77     public boolean onTouchEvent(MotionEvent event) {
 78         int action = event.getAction();
 79         float y = event.getY();
 80         position = (int) (y / (getHeight() / characters.length));
 81         if (position >= 0 && position < Constants.CITY_TYPE.length) {
 82             onTouchingLetterChangedListener.onTouchingLetterChanged(position);
 83             switch (action) {
 84                 case MotionEvent.ACTION_UP:
 85                     setBackgroundColor(Color.TRANSPARENT);
 86                     position = -1;
 87                     invalidate();
 88                     if (text_dialog != null) {
 89                         text_dialog.setVisibility(View.INVISIBLE);
 90                     }
 91                     break;
 92                 default:
 93                     setBackgroundColor(touchedBgColor);
 94                     invalidate();
 95                     text_dialog.setText(characters[position]);
 96                     break;
 97             }
 98         }else{
 99
100             setBackgroundColor(Color.TRANSPARENT);
101             if (text_dialog != null) {
102                 text_dialog.setVisibility(View.INVISIBLE);
103             }
104
105         }
106         return true;
107     }
108
109     public void setOnTouchingLetterChangedListener(
110             OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
111         this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
112     }
113
114
115     public interface OnTouchingLetterChangedListener {
116         public void onTouchingLetterChanged(int position);
117     }
118
119 }

SideBar

private void initSideBar() {

        sideBar.setTextDialog(dialog_text);
        sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {

            @Override
            public void onTouchingLetterChanged(int position) {
                String city_label = Constants.CITY_TYPE[position];
                for (int i = 0; i < cityList.size(); i++) {
                    if (cityList.get(i).getCityName().equals(city_label)) {

                        cityListView.setSelection(i);
                        dialog_text.setVisibility(View.VISIBLE);
                        break;
                    }
                    if(i == cityList.size() -1){

                        dialog_text.setVisibility(View.INVISIBLE);

                    }
                }
            }
        });

    }
上边的代码是在activity中引用sideBar  回调的方法  其他的稍作处理就可以运行了
时间: 2024-11-03 22:25:21

SideBar 选择城市时右侧边上的 选择bar的相关文章

美团HD(5)-选择城市

DJSelectCityViewController.m #import "DJSelectCityViewController.h" #import "DJConstantValue.h" #import "DJCityGroup.h" #import "MJExtension.h" @interface DJSelectCityViewController ()<UITableViewDataSource,UITab

选择城市列表的小Demo

先上源码: 选择城市列表的小Demo 选择城市列表的小Demo,布布扣,bubuko.com

选择省份时,自动显示对应省份的城市

在很多网页中,都会有让用户选择城市的选项,那么,就需要我们用js来实现,当用户选择了省份,自动选择对应省份的城市. <head>   <title></title>   <meta http-equiv="content" content="text/html" charset="utf-8"/>   <script type="text/javascript">  

Matlab在读取图像时怎么实现手动选择图像

平时看的一些关于图像处理的文献通常要在matlab里面写一下,以便加深对这个算法的理解,当然写好以后需要图像来测试,以前我常常在 path='图像所在的路径'; img=imread(path+图像的名字); 在imread函数中进行不断修改图像的名字,以便测试不同的图像对于该算法的效果如何. 想必大家也是常常这样做实验吧,今天突然想,这样一直改名字多麻烦多浪费时间,我觉得像Matlab这么强大的软件肯定提供这样的函数给用户,因为每个软件都要考虑用户体验的哈! 在网上搜了很久没找到非常好的答案,

1.选择城市

项目介绍 应用截图 主要功能 写的一个APP总结一下 使用车联网api解析天气数据并展示在界面 定位 通知栏 桌面小部件 动态添加删除城市并显示在界面上方便查看 选择城市界面 首先我网上找了个城市json数据信息,然后自己做了个json数据存放在res的raw目录下 然后需要解析出来存放在数据库中,不用每次都去解析json CoolWeatherOpenHelper public class CoolWeatherOpenHelper extends SQLiteOpenHelper { /**

XenMobile部署时的NetScaler Gateway选择

在部署Citrix XenMobile的时候,XenMobile有3个版本可供选择,分别为下图所示: 其中,MDM版本NetScaler是可选组件,其余的2个版本都需要集成NetScaler,或者说NetScaler是其余的两个版本的组件之一,必须使用的组件.那么在部署XenMobile时对于该组件,我们怎么选择呢? 在这里我介绍下部署XenMobile时NetScaler产品的选择. NetScaler的许可证分为平台许可(Platform License)和通用许可(Universal Li

ecshop添加商品选择品牌时如何按拼音排序

ECSHOP后台添加新商品时,有一个选择品牌的下拉框,如果品牌太多,在下拉框里查找起来很不方便. 我想给“下拉框里的品牌列表”按品牌名的拼音排序,比如有“中国水利出版社” “中国人民出版社” 这两个品牌名的拼音首字母都是 “Z”,这样的品牌放在一起,这样方便查找, 请问以上需求要如何修改ECSHOP模板来实现呢?? 教程: 首先,这个问题,只修改ECSHOP模板是不行的,得通过修改程序来实现 下面是修改方法: 1) 如果你的ECSHOP数据库使用的是GBK字符集,那么很简单 打开 /includ

winform 实现选择城市列表

先上图 #region 选择城市 /// <summary> /// 点击字母事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void item_Click(object sender, EventArgs e) { LinkLabel lbl = sender as LinkLab

每天一个JavaScript实例-动态省份选择城市

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-动态省份选择城市</title> <script> var citystore = new Array(); citystore = [[