一个仿手机联系人自动排序的列表实现sortlistview
(二)
在上一篇实现了基本的导航条,这里直接拿来使用,完成剩下部分的详情
拿图上来,看效果先
S71219-14231477.jpgS71219-14234724.jpg
S71219-14221862.jpg
比较常见的效果,这里有三种,主要由上一篇silderbar
实现的
这里采用的是ListView
来做的列表,用Recyclerview
也可以,看懂了直接移植过去就可以了。
先看布局:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.yukunkun.SideBarDemoActivity">
<ListView android:layout_width="match_parent"
android:id="@+id/list"
android:layout_height="match_parent">
</ListView>
<com.yukunkun.SideBar
android:textColor="@color/colorAccent"
android:textSize="15sp"
android:paddingRight="10dp"
sidebar:scaleTime="1"
android:layout_width="200dp"
android:id="@+id/bar"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
<TextView android:layout_width="55dp"
android:text="A"
android:id="@+id/tv"
android:gravity="center"
android:textSize="25sp"
android:visibility="gone"
android:textColor="#bb4e79f1"
android:background="@color/green"
android:layout_centerInParent="true"
android:layout_height="55dp"/>
</RelativeLayout>
东西不多,就是几个简单的布局
看使用的实现,在第一篇里面,可以知道silderbar
的使用了。
这里要用到汉语转拼音的库,即pinyin4j-2.5.0.jar。官网地址:
网上的一个工具类,下面我贴出来
/**
* Created by yukun on 17-12-19.
*/
public class Cn2Spell {
public static StringBuffer sb = new StringBuffer();
/**
* 获取汉字字符串的首字母,英文字符不变
* 例如:阿飞→af
*/
public static String getPinYinHeadChar(String chines) {
sb.setLength(0);
char[] chars = chines.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < chars.length; i++) {
if (chars[i] > 128) {
try {
sb.append(PinyinHelper.toHanyuPinyinStringArray(chars[i], defaultFormat)[0].charAt(0));
} catch (Exception e) {
e.printStackTrace();
}
} else {
sb.append(chars[i]);
}
}
return sb.toString();
}
/**
* 获取汉字字符串的第一个字母
*/
public static String getPinYinFirstLetter(String str) {
sb.setLength(0);
char c = str.charAt(0);
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c);
if (pinyinArray != null) {
sb.append(pinyinArray[0].charAt(0));
} else {
sb.append(c);
}
return sb.toString();
}
/**
* 获取汉字字符串的汉语拼音,英文字符不变
*/
public static String getPinYin(String chines) {
sb.setLength(0);
char[] nameChar = chines.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < nameChar.length; i++) {
if (nameChar[i] > 128) {
try {
sb.append(PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0]);
} catch (Exception e) {
e.printStackTrace();
}
} else {
sb.append(nameChar[i]);
}
}
return sb.toString();
}
}
直接使用,在数据这一块儿,用到了java里面的排序,实现Comparator
接口
public class PinyinComparator implements Comparator<SortModel> {
public int compare(SortModel o1, SortModel o2) {
if (o1.getSortLetters().equals("@")
|| o2.getSortLetters().equals("#")) {
return -1;
} else if (o1.getSortLetters().equals("#")
|| o2.getSortLetters().equals("@")) {
return 1;
} else {
return
}
}
}
这里可以优化,得到不同的判断
使用
private List<SortModel> getSortModule() {
List<SortModel> filterDateList = new ArrayList<SortModel>();
for (int i = 0; i < mStrings.length; i++) {
String pinYinFirstLetter = Cn2Spell.getPinYinFirstLetter(mStrings[i]);
SortModel sortModel=new SortModel(mStrings[i],pinYinFirstLetter.toUpperCase().charAt(0)+"");
filterDateList.add(sortModel);
}
Collections.sort(filterDateList,new PinyinComparator());
return filterDateList;
}
在这里,我们将我们的数据进行了排序,得到了按照英文字母来排序的集合,集合里多了拼音的字段,用作排序用
下面是常用的listview的常见使用,只有在adapter里面来处理了
final LVAdapter lvAdapter=new LVAdapter(sortModule,this);
mListView.setAdapter(lvAdapter);
//silderbar的回调
bar.setOnStrSelectCallBack(new ISideBarSelectCallBack() {
@Override
public void onSelectStr(int index, String selectStr) {
mTextView.setText(selectStr);
for (int i = 0; i < sortModule.size() ; i++){
if(sortModule.get(i).getSortLetters().equals(selectStr)){
mListView.setSelection(i);
return;
}
}
}
@Override
public void onSelectEnd() {
//只有SideBar.STYLENORMAL才会调用这个方法
mTextView.setVisibility(View.GONE);
}
@Override
public void onSelectStart() {
//只有SideBar.STYLENORMAL才会调用这个方法
mTextView.setVisibility(View.VISIBLE);
}
});
adapter是主要的实现。如下方法(代码有点长,主要的两个判断方法,可以直接在github下载)
/**
* 选中的位置
*/
public int getSectionForPosition(int position) {
return list.get(position).getSortLetters().charAt(0);
}
/**
* 位置是否有
*/
public int getPositionForSection(int section) {
for (int i = 0; i < getCount(); i++) {
String sortStr = list.get(i).getSortLetters();
char firstChar = sortStr.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}
return -1;
}
view的实现就是显示和隐藏
if(position == getPositionForSection(section)){
viewHolder.tvLetter.setVisibility(View.VISIBLE);
viewHolder.tvLetter.setText(mContent.getSortLetters());
}else{
viewHolder.tvLetter.setVisibility(View.GONE);
}
}