Android快速索引Demo

jopen 9年前發布 | 58K 次閱讀 Android Android開發 移動開發


    最近需要實現一個城市列表的快速索引功能。類似于聯系人應用,根據姓名首字母快速索引功能。

要實現這個功能只需要解決兩個問題:

        1、對列表進行分組(具有同一特征),并且能夠快速定位到該組的第一項
        2、右側分組‘特征’快速索引欄的實現

    第一個問題比較好解決,列表項可以根據相同的‘特征’來分組,比如說城市列表可以根據相同首字母的城市名來進行分組。
如何來定位到分組的第一項,只需要把分組的‘特征’和分組第一項下標關聯起來,快速索引欄就能快速定位分組第一項

    第二個問題可以通過自定義控件來實現,實現的形式有很多,可以通過繪制一整張分組‘特征’的圖片(難以擴展),也可以動態來繪制每一個分組‘特征’(可擴展性強)

    下面是一些實現的關鍵代碼,基本上就是上面思想的體現,如果自己有特殊的需求話,稍做改動就能行

    列表‘特征’和分組首項進行關聯

    for (int i = 0; i < mCitys.size(); i++) {  
        City city = mCitys.get(i);  
        String cityId = city.getId();  
        if(cityId == null || "".equals(cityId)) continue;  
        String section = cityId.toUpperCase().substring(0, 1);  
        if(!indexMap.containsKey(section)){  
            indexMap.put(section, i);  
        }  
    }  

    快速索引的繪制
    @Override  
    protected void onDraw(Canvas canvas) {  
        heightCenter = getMeasuredHeight()/2 - preHeight*WORDS.length/2;  
        for (int i = 0; i < WORDS.length; i++) {  
            canvas.drawText(String.valueOf(WORDS[i]), getMeasuredWidth()/2, preHeight  
                    + (i * preHeight) + heightCenter, mPaint);  
        }  
        super.onDraw(canvas);  
    }  

    用戶交互,快速定位到索引項
    public boolean onTouchEvent(MotionEvent event) {  
        int startY = (int) event.getY() - heightCenter;  
        int index = startY / preHeight;  
        if (index >= WORDS.length) {  
            index = WORDS.length - 1;  
        } else if (index < 0) {  
            index = 0;  
        }  
        if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {  
            int position = mSectionIndexter.getStartPositionOfSection(String.valueOf(WORDS[index]));  
            if (position == -1) {  
                return true;  
            }  
            mListView.setSelection(position);  
        }  
        return true;  
    }  

    效果圖如下:

20141225201301734.png

    

    源碼:https://github.com/TUBB/CityIndex

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!