在手机通讯录或者其他APPA软件中,好友联系人名单经常按字母顺序排列,而且按照首字母进行划分,如果有相同首字母的值显示该字母第一联系人的首字母,那么具体该怎么实现呢,此刻简单介绍一下:
首先联系人数据一般是在一个ListView控件中呈现,配置完适配器Adapter后,在Adapter的getView()方法中,数据与属性匹配完成后再设置是否显示分类首字母,初始代码如下:
/**
* 判断是否显示分类首字母
* 1.第一条数据(position=0)必须显示
* 2.与上一条首字母相同,则不显示,反之则显示
*
* /
if(position==0){
sortKey.setVisibility(View.VISIBLE);
}else{
//判断首字母
int lastSection=contacts.get(position-1).getName().charAt(0);
int currentSection=contact.getName().charAt(0);
if(lastSection==currentSection){
sortKey.setVisibility(View.GONE);
}else{
sortKey.setVisibility(View.VISIBLE);
}
}
//返回组装数据后的View对象
return view;
上述代码可以优化如下:
sortKey.setVisibility(View.VISIBLE);
int currentSection=contact.getName().charAt(0);
if(position!=0&&contacts.get(position-1).getName().charAt(0)==currentSection){
sortKey.setVisibility(View.GONE);
}
//返回组装数据后的view对象
return view;
上述是按照传统方法进行显示,按照上述逻辑,每显示一个条目都要将首字母从头开始按顺序找一遍,一下方法则直接定位该显示条目的位置,在为控件匹配完数据之后,代码如下:
//1.根据当前position获取应该显示的首字母的section
int section=getSectionForPosition(position);
//2.获取该section应该出现的位置
int pos=getPositionForSection(section);
//3.判断当前列表项的position是否和该首字母应该出现的position相等
if(position==pos){
sortKey.setVisibility(View.VISIBLE);
}else{
sortKey.setVisibility(View.GONE);
}
return view;
}
/**
*根据首字母section获取应该出现的位置position
*/
@Override
public int getPositionForSection(int section){
//根据Section(首字母)获取Position(位置):即获取某个瘦子木用该出现的位置
for(int i=0;i<contacts.size();i++){
int ch=contacts.get(i).getName().charAt(0);
if(ch==section){
return i;
}
}
return 0;
}
/**
*根据position获取应该显示 的首字母section
*/
@Override
public int getSectionForPosition(int position){
//根据Position(位置)获取Section(首字母):获取某个位置上应该显示的首字母
return contacts.get(position).getName().charAt(0);
}
这样每次判断是否显示首字母就不用从第一行开始依次比对了,直接定位到显示的位置判断是否显示就行了.