在手機通訊錄或者其他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);
}
這樣每次判斷是否顯示首字母就不用從第一行開始依次比對了,直接定位到顯示的位置判斷是否顯示就行了.