zoukankan      html  css  js  c++  java
  • ListView 字母导航排序

    一.概述

    ListView字母导航排序,网上已经有很多代码和博客了, 这篇博文也是照搬网上的.  之所以写到这里,不是为了说明什么,只是为了以后自己查阅方便.本来公司要求实现expandablelistview + 字母导航的, 这里先抄袭一下 ListView的 字母导航, 此处没有实现挤压效果.

    二.代码

    package com.example.sortlistview;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Typeface;
    import android.graphics.drawable.ColorDrawable;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.TextView;
    
    public class SideBar extends View {
        // 触摸事件
        private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
        // 26个字母
        public static 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 TextView mTextDialog;
    
        public void setTextView(TextView mTextDialog) {
            this.mTextDialog = mTextDialog;
        }
    
    
        public SideBar(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public SideBar(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public SideBar(Context context) {
            super(context);
        }
    
        /**
         * 重写这个方法
         */
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // 获取焦点改变背景颜色.
            int height = getHeight();// 获取对应高度
            int width = getWidth(); // 获取对应宽度
            int singleHeight = height / b.length;// 获取每一个字母的高度
    
            for (int i = 0; i < b.length; i++) {
                paint.setColor(Color.rgb(33, 65, 98));
                // paint.setColor(Color.WHITE);
                paint.setTypeface(Typeface.DEFAULT_BOLD);
                paint.setAntiAlias(true);
                paint.setTextSize(20);
                // 选中的状态
                if (i == choose) {
                    paint.setColor(Color.parseColor("#3399ff"));
                    paint.setFakeBoldText(true);
                }
                // x坐标等于中间-字符串宽度的一半.
                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();// 点击y坐标
            final int oldChoose = choose;
            final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
            final int c = (int) (y / getHeight() * b.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.
    
            switch (action) {
            case MotionEvent.ACTION_UP:
                setBackgroundDrawable(new ColorDrawable(0x00000000));
                choose = -1;//
                invalidate();
                if (mTextDialog != null) {
                    mTextDialog.setVisibility(View.INVISIBLE);
                }
                break;
    
            default:
                setBackgroundResource(R.drawable.sidebar_background);
                if (oldChoose != c) {
                    if (c >= 0 && c < b.length) {
                        if (listener != null) {
                            listener.onTouchingLetterChanged(b[c]);
                        }
                        if (mTextDialog != null) {
                            mTextDialog.setText(b[c]);
                            mTextDialog.setVisibility(View.VISIBLE);
                        }
                        
                        choose = c;
                        invalidate();
                    }
                }
    
                break;
            }
            return true;
        }
    
        /**
         * 向外公开的方法
         * 
         * @param onTouchingLetterChangedListener
         */
        public void setOnTouchingLetterChangedListener(
                OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
            this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
        }
    
        /**
         * 接口
         * 
         * @author coder
         * 
         */
        public interface OnTouchingLetterChangedListener {
            public void onTouchingLetterChanged(String s);
        }
    
    }

    该类目的就是实现 ListView 右侧字母导航条

    对于列表的数据我是这么做的, 首先我定义一个 Bean类,存放json解析后的结果, 然后再排序的时候,把用到的 json字段又定义到了SortModel中作为属性,根据需要往这个类添加必要属性即可, 实际开发我也是这么做的, 不知道有没有更好的方法.

    多说无益,由于服务器还是测试阶段,所以我把json 存到了assets目录中,直接看图

    代码存放到了360网盘, 地址:

    https://yunpan.cn/cqY2h3xHeVbDn (提取码:3b21)

    ExpandableListview的 字母导航,将在后面博文中给出.

  • 相关阅读:
    c语言结构体数组引用
    c语言结构体数组定义的三种方式
    如何为SAP WebIDE开发扩展(Extension),并部署到SAP云平台上
    SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
    使用SAP API portal进行SAP SuccessFactors的API测试
    SAP UI5应用里的页面路由处理
    在SAP WebIDE Database Explorer里操作hdi实例
    如何使用SAP事务码SAT进行UI应用的性能分析
    使用SAP WebIDE进行SAP Cloud Platform Business Application开发
    SAP CRM WebClient UI ON_NEW_FOCUS的用途
  • 原文地址:https://www.cnblogs.com/android-zcq/p/5352946.html
Copyright © 2011-2022 走看看