自定義view實戰筆記--快速索引

一:在Java中,自定義類想要比較需要實現Comparable接口,並重寫compareTo方法

二:可以使用工具類Collections.sort(haoHanArrayList);對自定義集合進行排序

三:除以2,可以使用乘以0.5f,這樣不容易丟失精度

四:要讓字母顯示在父控件的中間,可以如下:

//1 繪製 A-Z 26個字母
        for (int i = 0; i < LETTERS.length; i++) {
            mPaint.setColor(i == lastTouchIndex ? Color.GREEN : Color.WHITE);
            //獲取到字母的邊界矩形
            Rect rect = new Rect();
            mPaint.getTextBounds(LETTERS[i], 0, LETTERS[i].length(), rect);
            //把字母畫在單元格的中間
            float x = ceilWidth * 0.5f - rect.width() * 0.5f;
            float y = ceilHeight * 0.5f + rect.height() * 0.5f + i * ceilHeight;

            canvas.drawText(LETTERS[i], x, y, mPaint);
        }

五:判斷觸摸到哪個字母,並且提高效率

 //判斷觸摸到了哪個字母
                float downY = event.getY();
                currentTouchIndex = (int) (downY / ceilHeight);
                if (currentTouchIndex != lastTouchIndex) {
                    if (currentTouchIndex >= 0 && currentTouchIndex < LETTERS.length) {
                        lastTouchIndex = currentTouchIndex;
                        Utils.showToast(getContext(), LETTERS[lastTouchIndex]);
                        if (mOnLetterChangeListener != null) {
                            mOnLetterChangeListener.onLetterChange(LETTERS[lastTouchIndex]);
                        }
                    }
                }

六:理解監聽回調的步驟,一般自定義view肯定會用到

    public void setOnLetterChangeListener(OnLetterChangeListener  mOnLetterChangeListener) {
        this.mOnLetterChangeListener = mOnLetterChangeListener;
    }

    private OnLetterChangeListener mOnLetterChangeListener;


    interface OnLetterChangeListener {
        void onLetterChange(String letter);
    }

七:一般可以在onSizeChanged()方法中去拿到控件的寬高,並做處理

 @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        //每一個字母單元格的高度
        ceilHeight = h * 1.0f / LETTERS.length;
        //每一個字母單元格的寬度
        ceilWidth = w;
    }

八:在觸摸的時候讓listView跟隨滾動,可以先獲取到listview滾動到的位置,然後listView.setSelection(position);

qiv.setOnLetterChangeListener(new QuickIndexerView.OnLetterChangeListener() {
    @Override
    public void onLetterChange(String letter) {
        //找到listview需要滾動到的位置
        for (int i = 0; i < haoHanArrayList.size(); i++) {
            if (letter.equals(haoHanArrayList.get(i).getFirstLetter())) {
                listView.setSelection(i);
                tv_header.setText(haoHanArrayList.get(i).getFirstLetter());
                break;
            }
        }
    }
});

九:listview的懸浮標題通常可以用表頭佈局覆蓋在listview頂部,然後在OnScrollListener中去修改值

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        tv_header.setText(haoHanArrayList.get(firstVisibleItem).getFirstLetter());

    }
});

十:在listview的Adapter的getview方法中,如果有需要比較上下兩個條目,可以把第一條分開來

if(position == 0) {

}else{

}

這樣不容易數組越界

十一:移除handler之前的延時操作:mHandler.removeCallbacksAndMessages(null);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章