有时候我们希望的在列表中把数据按照一定的逻辑分类显示,比如按照字母A B C等分层,在IOS中的列表是有section这个概念的,但在Android中这个功能需要自己实现。
基本的思想是在每一个Item项的上方中都添加一个TextView用来显示标头,如果这个标头是第一次出现,则把它显示出来,否则就是GONE了。判断标头是第一次出现的方法如下:先获取position属于哪个section,
再获取此section出现的首位置,然后就是判断position是否是首位置了。第二步中获取到的首位置信息可以用一个map之类的东西缓存起来,因为这个信息会被不断地查询。
/**
* 根据ListView的当前位置获取分类的首字母的Char ascii值
*/
public int getSectionForPosition(int position) {
return list.get(position).getSortLetters().charAt(0);
}
private Map<Integer, Integer> mSectionPositions = new HashMap<>();
/**
* 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
*/
public int getPositionForSection(int section) {
if (mSectionPositions.containsKey(section)) {
return mSectionPositions.get(section);
}
for (int i = 0; i < getCount(); i++) {
String sortStr = list.get(i).getSortLetters();
char firstChar = sortStr.toUpperCase().charAt(0);
if (firstChar == section) {
mSectionPositions.put(section, i);
return i;
}
}
return -1;
}
// 根据position获取分类的首字母的Char ascii值
int section = getSectionForPosition(position);
// 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
if (position == getPositionForSection(section)) {
viewHolder.tvLetter.setVisibility(View.VISIBLE);
viewHolder.tvLetter.setText(mContent.getSortLetters());
} else {
viewHolder.tvLetter.setVisibility(View.GONE);
}