一:在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);