在ListView的右边添加字母列表,点击某个字母时,列表就滚动到预期位置。

<!-- 数字和字母栏在标题栏下边并且停靠在右边 -->
<com.txrj.sms.component.QuickAlphaBar
    android:id="@+id/fast_scroller"
    android:layout_width="22dp"
    android:layout_height="fill_parent"
    android:layout_alignParentRight="true"
    android:layout_below="@+id/title_bar"
    android:layout_gravity="top|right|center"
    android:layout_marginTop="0dip"
    android:background="@null"
    android:scaleType="centerInside"
    android:src="@drawable/dic_background" />

<!-- 当前滚动到哪个字母那里 -->
<TextView
    android:id="@+id/fast_position"
    android:layout_width="70dip"
    android:layout_height="70dip"
    android:layout_centerInParent="true"
    android:layout_gravity="center_horizontal|top"
    android:layout_margin="34dip"
    android:background="@drawable/sort_icon_bg_click"
    android:gravity="center"
    android:padding="2dip"
    android:textColor="#404040"
    android:textSize="48dip"
    android:visibility="invisible" />

/**
* @ClassName QuickAlphaBar
* @description
* @author Txrj
* @date 2013-7-9 上午10:56:16
*/
public class QuickAlphaBar extends ImageButton {
   
    private String[] letters = new String[] { "#", "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 Paint mPaint = new Paint();
    private int select = 0;
    private int singleHeight;
    private ListView mListView;
    private TextView mAlphsTextView;
    private HashMap<String, Integer> alphaIndexer;
    private Handler mHandler = new Handler();

    public QuickAlphaBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
   
    /* (non-Javadoc)
     * @see android.view.View#onTouchEvent(android.view.MotionEvent)
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int lastSelect = select;       
        int index = (int) (event.getY() / singleHeight);
        if (index >= 0 && index < letters.length) {
            String alpha = letters[index];
            if (alphaIndexer.containsKey(alpha)) {
                int position = alphaIndexer.get(alpha);
                if (mListView.getHeaderViewsCount() > 0) {
                    mListView.setSelectionFromTop(position
                            + mListView.getHeaderViewsCount(), 0);
                } else {
                    mListView.setSelectionFromTop(position, 0);
                }
                mAlphsTextView.setText(letters[index]);
            }
        }
        switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if(lastSelect != index) {
                if(index >= 0 && index < letters.length) {
                    select = index;
                    invalidate();
                }
            }
            mAlphsTextView.setVisibility(VISIBLE);
            break;
        case MotionEvent.ACTION_MOVE:
            if(lastSelect != index) {
                if(index >= 0 && index < letters.length) {
                    select = index;
                    invalidate();
                }
            }
            break;
        case MotionEvent.ACTION_UP:
            select = -1;
            mAlphsTextView.setVisibility(INVISIBLE);
            break;
        }
        return super.onTouchEvent(event);
    }
   
    /* (non-Javadoc)
     * @see android.widget.ImageView#onDraw(android.graphics.Canvas)
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        singleHeight = getHeight() / letters.length;
        for(int i=0;i<letters.length;i++){
            mPaint.setTextSize(20);
            mPaint.setTypeface(Typeface.DEFAULT_BOLD);
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.GRAY);
            if(i == select) {
                mPaint.setColor(Color.parseColor("#00BFFF"));
                mPaint.setFakeBoldText(true);
            }
            float x = getWidth() / 2 - mPaint.measureText(letters[i]) / 2;
            float y = singleHeight * (i + 1);
            canvas.drawText(letters[i], x, y, mPaint);
            mPaint.reset();
        }
    }
   
    public void setListView(ListView listView) {
        mListView = listView;
    }
   
    public void setAlphaIndexer(HashMap<String, Integer> alphaIndexer) {
        this.alphaIndexer = alphaIndexer;
    }
   
    public void setTextView(TextView textView) {
        this.mAlphsTextView = textView;
    }
}

在ListView的右边添加字母列表的更多相关文章

  1. 获取subgrid中的数据并修改,含添加刷新列表的事件

    var isAddRefresh = false; function setLawsuitQueryResultText() { var queryResultIndex = 7; var gridC ...

  2. 在 Wiki 标记中添加无序列表

    项目:在 Wiki 标记中添加无序列表在编辑一篇维基百科的文章时,你可以创建一个无序列表,即让每个列表项占据一行,并在前面放置一个星号.但是假设你有一个非常大的列表,希望添加前面的星号.你可以在每一行 ...

  3. Python实践练习:在 Wiki 标记中添加无序列表

    题目描述 项目:在 Wiki 标记中添加无序列表 在编辑一篇维基百科的文章时,你可以创建一个无序列表,即让每个列表项占据一行,并在前面放置一个星号.但是假设你有一个非常大的列表,希望添加前面的星号.你 ...

  4. 项目一:第三天 收派标准添加 收派标准分页查询(基于datagrid实现) 收派标准修改快递员添加 快递员列表查询

    1.收派标准添加 n jQuery easyUI window使用 n jQuery easyUI form表单校验 n 收派标准添加页面调整—url params n 服务端实现—三层 2.jQue ...

  5. WPF: 在ListView中添加Checkbox列表

    描述:ListView是WPF中动态绑定工具的数据容器,本文实现了一个在ListView中显示的供用户选择的列表项目,并且控制列表中选择的项目数量,即实现单选. XAML中创建ListView,代码如 ...

  6. 从零开始编写自己的C#框架(22)——添加普通列表页面

    普通列表页面指的是上一章那种有层次感列表以外的正常列表页面,由于上一章已讲解了正常添加页面的相关操作了,所以部分相关的操作本章节就不再罗嗦重复一次了.大家可以试试先用本章内容中的一些简单介绍,自己使用 ...

  7. 关于SimpleAdapter和ListView结合使用,实现列表视图的笔记

    使用ListView需要为其添加适配器: 适配器有两种:1.ArrayAdapter  --用于单独文字显示 2.SimpleAdapter --用于文字和图片显示 这里主要记录SimpleAdapt ...

  8. dedecms讲解-arc.listview.class.php分析,列表页展示

    ./plus/list.php - 动态展示栏目列表页(也可能是频道封面)arc.listview.class.php 是dedecms的列表页的相关处理类__construct()         ...

  9. Add-VMNetworkAdapterAcl(添加访问控制列表)

    Add-VMNetworkAdapterAclCreates an ACL to apply to the traffic through a virtual machine network adap ...

随机推荐

  1. (原)用WebBrowser浏览Office Web Apps Server,除去“下载”按钮

    对,没错,如果你按关键字找到这篇随笔了,相信一定知道背景,以及我所说的是什么. 上一段子代码. private void timerHideButton_Tick(object sender, Eve ...

  2. MiniGUI ial 移植指南

    MiniGUI ial 移植指南 2.1 ial的定义 ial是一个通用的抽象输入接口,可以输入统一的数据的结构,也就是说在MiniGUI的核心代码里输入的数据的格式是固定的,不管输入设备是鼠标 还是 ...

  3. 似然和对数似然Likelihood & LogLikelihood

    One of the most fundamental concepts of modern statistics is that of likelihood. In each of the disc ...

  4. PASCAL VOC数据集The PASCAL Object Recognition Database Collection

    The PASCAL Object Recognition Database Collection News 04-Apr-07: The VOC2007 challenge development ...

  5. linux的chmod,chown命令详解

    指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案 ...

  6. poj 2284 That Nice Euler Circuit 解题报告

    That Nice Euler Circuit Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 1975   Accepted ...

  7. 【BZOJ】【3671】【NOI2014】随机数生成器

    贪心 嗯……其实生成这个矩阵就是一个$O(n^2)$的模拟 = = 然后?字典序最小?贪心呗= =能选1就选1,然后能选2就选2…… 我们发现,对于矩阵(1,1)~(n,m),假设1的位置是(x,y) ...

  8. [开发工具]_[VS2010]_[vs2010的一个bug-使用stringstream时出现]

    1. 注冊Microsfot之后想提交bug, 发现有这个提示, 所以提交不了bug, 有能提交的提交下吧. You are not authorized to submit the feedback ...

  9. 在Java程序中使用Hibernate

    Hibernate是一种ORM框架,ORM全称为Object-Relative Database-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象(一般为实体类) ...

  10. AngularJs HTTP响应拦截器实现登陆、权限校验

    $httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...