android comparator实现排序,一个仿手机联系人自动排序的列表实现sortlistview(二)...

一个仿手机联系人自动排序的列表实现sortlistview(二)

在上一篇实现了基本的导航条,这里直接拿来使用,完成剩下部分的详情

拿图上来,看效果先

9181e59bb946

S71219-14231477.jpg

9181e59bb946

S71219-14234724.jpg

9181e59bb946

S71219-14221862.jpg

比较常见的效果,这里有三种,主要由上一篇silderbar实现的

这里采用的是ListView来做的列表,用Recyclerview也可以,看懂了直接移植过去就可以了。

先看布局:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

xmlns:sidebar="http://schemas.android.com/apk/res-auto"

tools:context="com.yukunkun.SideBarDemoActivity">

android:id="@+id/list"

android:layout_height="match_parent">

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"/>

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"/>

东西不多,就是几个简单的布局

看使用的实现,在第一篇里面,可以知道silderbar的使用了。

这里要用到汉语转拼音的库,即pinyin4j-2.5.0.jar。官网地址:http://pinyin4j.sourceforge.net/

网上的一个工具类,下面我贴出来

/**

* 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 {

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 o1.getSortLetters().compareTo(o2.getSortLetters());

}

}

}

这里可以优化,得到不同的判断

使用

private List getSortModule() {

List filterDateList = new ArrayList();

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);

}

可以在github下载demo查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值