迷你播放器--第一阶段(6)

添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配;

本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article/details/38434239

查看项目源代码请前往:迷你播放器-综述

请注意,该项目为android项目,如果已经学习过这一节请阅读下一篇。

先上效果图(本项目出现的小bug将在下一阶段修复,同时界面将有一定调整)

注:本节参考了xiaanming 的博客:http://blog.csdn.net/xiaanming/article/details/12684155,详情请打开链接,有详细的原理介绍,这里主要讲我优化的地方
  1. 重写排序方法
  2. 针对onScroll会出现的一些错误进行修复;
  3. 快速定位如果点击的字母没有存在节点,则定位到该字母前一个最近的节点;
  4. 支持使用大小写进行搜索,例如存在 广岛之恋-莫文蔚.mp3,无论输入"Guang"还是"guang"还是"广"都能给出搜索结果。

1、重写排序方法,两个if的作用是将如果输入的是拼音,将以汉字为开头的数据排在后面。

package com.liangrensheng.music_player.player;import java.util.Comparator;import com.liangrensheng.music_player.player.MusicData;/*** PinyinComparator接口用来对ListView中的数据根据A-Z进行排序, 前面两个if判断主要是将不是以汉字开头的数据放在后面* */
public class MusicComparator implements Comparator<MusicData> {@Overridepublic int compare(MusicData o1, MusicData o2) {if (o1.mSortLetter.equals("@") || o2.mSortLetter.equals("#")) {return -1;} else if (o1.mSortLetter.equals("#") || o2.mSortLetter.equals("@")) {return 1;} else {return o1.mSortLetter.compareTo(o2.mSortLetter);}}
}

2、针对原项目ListView中onScroll时间的一些优化,主要是为了使搜索结果页面在滑动的时候依然具有挤压效果。

       mListView.setOnScrollListener(new OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (totalItemCount == 0) { // 如果没有item则无需配置挤压效果titleLayout.setVisibility(View.GONE);return;} else if (totalItemCount == 1) { // 仅有一个的时候是没有nextSection的titleLayout.setVisibility(View.VISIBLE);int section = mListViewAdapter.getSectionForPosition(firstVisibleItem);title.setText(mListViewAdapter.getBean(mListViewAdapter.getPositionForSection(section)).sortLetters);} else {titleLayout.setVisibility(View.VISIBLE);int section = mListViewAdapter.getSectionForPosition(firstVisibleItem);int nextSection = mListViewAdapter.getSectionForPosition(firstVisibleItem + 1);int nextSecPosition = mListViewAdapter.getPositionForSection(+nextSection);if (firstVisibleItem != lastFirstVisibleItem) {MarginLayoutParams params = (MarginLayoutParams) titleLayout.getLayoutParams();params.topMargin = 0; // 初始位置titleLayout.setLayoutParams(params);title.setText(mListViewAdapter.getBean(mListViewAdapter.getPositionForSection(section)).sortLetters);}if (nextSecPosition == firstVisibleItem + 1) { // 实现挤压效果View childView = view.getChildAt(0);if (childView != null) {int titleHeight = titleLayout.getHeight();int bottom = childView.getBottom();MarginLayoutParams params = (MarginLayoutParams) titleLayout.getLayoutParams();if (bottom < titleHeight) {float pushedDistance = bottom - titleHeight;params.topMargin = (int) pushedDistance;titleLayout.setLayoutParams(params);} else if (params.topMargin != 0) {params.topMargin = 0;titleLayout.setLayoutParams(params);}}}lastFirstVisibleItem = firstVisibleItem;}}});

3、快速定位如果点击的字母没有存在节点,则定位到该字母前一个最近的节点。

      sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {@Overridepublic void onTouchingLetterChanged(String s) { // 设置右侧触摸监听// 该字母首次出现的位置char ch = s.charAt(0);int position = mListViewAdapter.getPositionForSection(ch);while (position == -1) { // 找不到则找最近的一个ch--;if (ch < 'A')break;position = mListViewAdapter.getPositionForSection(ch);}mListView.setSelection(position);}});

4、支持使用大小写进行搜索,例如存在 广岛之恋-莫文蔚.mp3,无论输入"Guang"还是"guang"还是"广"都能给出搜索结果。

   /*** 根据输入框中的值来过滤数据并更新ListView* * @param filterStr*/private void filterData(String filterStr) { //这个filterStr在传入的时候已经转化为小写的了List<ListViewBean> filterDateList = new ArrayList<ListViewBean>();if (TextUtils.isEmpty(filterStr)) {filterDateList = mListViewSource;tvNoMusic.setVisibility(View.GONE);} else {filterDateList.clear();for (ListViewBean sortModel : mListViewSource) {String name = sortModel.musicName.toLowerCase();// 转为小写在寻找if (name.indexOf(filterStr) != -1|| characterParser.getSelling(name).startsWith(filterStr)) {filterDateList.add(sortModel);}}}// 根据a-z进行排序Collections.sort(filterDateList, listViewComparator);mListViewAdapter.refreshAdapter(filterDateList);lastFirstVisibleItem = -1;// 刷新了列表,布局重新初始化MarginLayoutParams params = (MarginLayoutParams) titleLayout.getLayoutParams();params.topMargin = 0;// 初始位置titleLayout.setLayoutParams(params);if (filterDateList.size() == 0) {tvNoMusic.setVisibility(View.VISIBLE);}}

本小节源代码下载 : http://download.csdn.net/detail/lrs0304/7730235

迷你播放器--第一阶段(6)--添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配相关推荐

  1. 迷你播放器--第一阶段(5)--添加搜索功能--autoCompleteBox的使用

    迷你播放器--第一阶段(5) 添加搜索功能--autoCompleteBox的使用; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...

  2. 迷你播放器--第一阶段(1)--检索媒体音乐并添加到List播放列表

    迷你播放器--第一阶段(1) 检索音乐并添加到List播放列表--媒体库的检索以及list列表使用 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/ ...

  3. 迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试

    迷你播放器--第一阶段(7) 安全攻防第一战--对抗反编译,代码混淆和对抗动态调试; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...

  4. 迷你播放器--第一阶段(2)--退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果

    迷你播放器--第一阶段(2) 退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/artic ...

  5. 迷你播放器--第一阶段(3)--MediaPlayer的封装

    迷你播放器--第一阶段(3) MediaPlayer的封装--利用intent实现消息传递 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/arti ...

  6. 迷你播放器--第一阶段(4)--内存卡检索不到音乐的错误处理--程序内部空间管理

    迷你播放器--第一阶段(4) 内存卡检索不到音乐的错误处理--程序内部空间管理 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article/de ...

  7. 做一个迷你播放器放在桌面

    效果如图 功能 随意选取歌曲,循环播放,有音谱效果,音量控制,显示歌曲名,歌曲控制(播放与暂停.下一首和上一首) 操作 将下面文件下载解压后放在MP3音乐文件夹内(该文件用FLASHPACKER打包) ...

  8. (十八)用JAVA编写MP3解码器——迷你播放器

    2019独角兽企业重金招聘Python工程师标准>>> 1.定义解码一帧的接口   ILayer123 Layer1.Layer2和Layer3这三个类都实现了ILayer123的d ...

  9. Vue 自定义音乐播放器组件为H5添加背景音乐

    自定义音乐播放器组件为H5添加背景音乐: 1.创建music.vue组件 <template><div><div @click="changeOn" ...

最新文章

  1. Tom Clancy's Splinter Cell: Double Agent
  2. 采购计算机的,如何采购计算机
  3. 寻找MEET大会直播中奖的小伙伴,你有红包待领取~
  4. python中的引用怎么理解_Python函数通过引用调用
  5. 【miscellaneous】北斗短报文
  6. adb native raact 夜神_React Native 与 夜神模拟器的绑定
  7. pc css框架,PC端框架—semantic ui
  8. Android 视频图片 轮播,详解android 视频图片混合轮播实现
  9. 中文文本对齐_终于明白Word如何快速对齐姓名!为之前狂敲空格的我,留下一把泪...
  10. 【Gym-101775 J】Straight Master【差分、贪心】
  11. 玩玩直播,搭建一个流媒体服务器
  12. android 无损分区,有什么可行办法把安卓4.4用的tf卡第一个分区从fat32无损转换成ext4?...
  13. tkmybatis 枚举值处理
  14. EAS后台事务的超时时长如何设置?
  15. linux中的文件搜索命令
  16. word按backspace键不能删除问题
  17. 2019产品数据管理(PDM)技术说明
  18. 第二节 物料清单(BOM)
  19. MySQL学习笔记04-DDL语句学习
  20. 【SPSS】百分位数计算方法探讨:SPSS计算差异

热门文章

  1. maven中无法下载ojdbc
  2. android bluetooth——蓝牙的开启、搜索、配对与连接
  3. 在文件管理器中显示图片的缩略图和视频第一帧的缩略图
  4. logo计算机编程简单指令,pc logo 基本绘图命令
  5. 全球与中国Adobe渠道合作伙伴市场现状及未来发展趋势
  6. 世界首个四足后空翻MIT机器猎豹踢足球,网友惊呼:终结者来了!
  7. 状态机的C语言编程(转)
  8. Win10锁屏自动暂停音乐播放,解锁后恢复
  9. C#代码实现上传文件到SharePoint文档库
  10. 怎样让您的电脑待机耗电等于零?