当IndexBar设置为需要真实索引时,新增索引标识会直接加在IndexBar的底部
Opened this issue · 3 comments
IndexBarDataHelperImpl#getSortedIndexDatas
自行修改源码,如仿微信通讯录:
// 对数据原进行排序 Collections.sort(indexDatas, new Comparator<String>() { @Override public int compare(String o1, String o2) { if (o1.equals("↑")) { return -1; } else if (o2.equals("↑")) { return 1; } else if (o1.equals("#")) { return 1; } else if (o2.equals("#")) { return -1; } else { return o1.compareTo(o2); } } });
解决了。说下我的解决办法。当获取到数据源,会调用IndexBar的 invalidate 方法。这时候要对集合进行排序。再绘制就没问题了。
在 IndexBar的onDraw 方法修改一下:
@OverRide
protected void onDraw(Canvas canvas) {
int t = getPaddingTop();//top的基准点(支持padding)
String index;//每个要绘制的index内容
// 对数据原进行排序
Collections.sort(mIndexDatas, new Comparator<String>() {
@Override public int compare(String o1, String o2) {
if (o1.equals("↑")) {
return -1;
} else if (o2.equals("↑")) {
return 1;
} else if (o1.equals("#")) {
return 1;
} else if (o2.equals("#")) {
return -1;
} else {
return o1.compareTo(o2);
}
}
});
for (int i = 0; i < mIndexDatas.size(); i++) {
index = mIndexDatas.get(i);
Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();//获得画笔的FontMetrics,用来计算baseLine。因为drawText的y坐标,代表的是绘制的文字的baseLine的位置
int baseline = (int) ((mGapHeight - fontMetrics.bottom - fontMetrics.top) / 2);//计算出在每格index区域,竖直居中的baseLine值
canvas.drawText(index, mWidth / 2 - mPaint.measureText(index) / 2, t + mGapHeight * i + baseline, mPaint);//调用drawText,居中显示绘制index
}
}
楼上的方法可以解决 添加的时候 新增索引标识会直接加在IndexBar的底部的问题.
但是不能解决移除的时候 需要移除的索引角标不没有被移除
所以根本的解决方法是 重写 IIndexBarDataHelper的getSortedIndexDatas方法
每次遍历的时候之前,需要清除indexDatas
//避免 添加的时候排序异常 移除的时候没有移除响应的索引
public IIndexBarDataHelper getSortedIndexDatas(List<? extends BaseIndexPinyinBean> sourceDatas, List<String> indexDatas) {
if (null != sourceDatas && !sourceDatas.isEmpty()) {
int size = sourceDatas.size();
indexDatas.clear(); //避免添加的时候排序异常 移除的时候没有移除响应的角标
for (int i = 0; i < size; ++i) {
String baseIndexTag = ((BaseIndexPinyinBean) sourceDatas.get(i)).getBaseIndexTag();
if (!indexDatas.contains(baseIndexTag)) {
indexDatas.add(baseIndexTag);
}
}
return this;
} else {
return this;
}
}