在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. python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  2. CAS工作流程

    CAS3.0的工作流程: 0.app将用户转发到CAS处, 并将自己的url作为callback参数传给CAS. 1.CAS验证用户成功(authentication) 2.生成用户实体(princi ...

  3. 《Windows核心编程》第五章——作业

    #include <windows.h> #include<iostream> #include <tchar.h> using namespace std; ty ...

  4. [Linux]在终端启动程序关闭终端不退出的方法

    一般情况下关闭终端时,那么在这个终端中启动的后台程序也会终止,要使终端关闭后,后台程序保持执行,使用这个指令: nohup 命令 & 如:nohup test.sh & 回车,然后提示 ...

  5. Interpreter Expression 解释器模式 MD

    解释器模式 简介 Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法. 应用环境: 如果一种特定类 ...

  6. 分享七个绚丽夺目的JQuery导航(还有苹果、猪八戒等),有图有真相

    今天来一起看看几个个人觉得比较好的导航.有好几个导航是仿的,比如仿苹果.仿猪八戒等等,但仿得还都不错.也有不少是基于jQuery的.特别是像我这样的懒人,就可以在这些基础上修修改改作为自己网站项目的导 ...

  7. OpenGL使用libPng读取png图片

    #include<stdarg.h> #include<png.h> #include<glut.h> #include<math.h> #includ ...

  8. C++11 lambda 表达式解析

    C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...

  9. ntpdate设置

    ntpdate设置 学习了:https://www.cnblogs.com/ibnode/p/3573302.html http://www.blogjava.net/spray/archive/20 ...

  10. Sqlserver2008相关配置问题

    一:ReportServices  无法连接Report Services 数据库服务 SSRS连接不了ReportServer (安装数据库的时候默认安装的一个报表服务数据库) 原因:装系统之后改了 ...