迷你播放器--第一阶段(6)--添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配
迷你播放器--第一阶段(6)
添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配;
本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article/details/38434239
查看项目源代码请前往:迷你播放器-综述
先上效果图(本项目出现的小bug将在下一阶段修复,同时界面将有一定调整)
- 重写排序方法
- 针对onScroll会出现的一些错误进行修复;
- 快速定位如果点击的字母没有存在节点,则定位到该字母前一个最近的节点;
- 支持使用大小写进行搜索,例如存在 广岛之恋-莫文蔚.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);}}
迷你播放器--第一阶段(6)--添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配相关推荐
- 迷你播放器--第一阶段(5)--添加搜索功能--autoCompleteBox的使用
迷你播放器--第一阶段(5) 添加搜索功能--autoCompleteBox的使用; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...
- 迷你播放器--第一阶段(1)--检索媒体音乐并添加到List播放列表
迷你播放器--第一阶段(1) 检索音乐并添加到List播放列表--媒体库的检索以及list列表使用 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/ ...
- 迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试
迷你播放器--第一阶段(7) 安全攻防第一战--对抗反编译,代码混淆和对抗动态调试; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...
- 迷你播放器--第一阶段(2)--退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果
迷你播放器--第一阶段(2) 退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/artic ...
- 迷你播放器--第一阶段(3)--MediaPlayer的封装
迷你播放器--第一阶段(3) MediaPlayer的封装--利用intent实现消息传递 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/arti ...
- 迷你播放器--第一阶段(4)--内存卡检索不到音乐的错误处理--程序内部空间管理
迷你播放器--第一阶段(4) 内存卡检索不到音乐的错误处理--程序内部空间管理 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article/de ...
- 做一个迷你播放器放在桌面
效果如图 功能 随意选取歌曲,循环播放,有音谱效果,音量控制,显示歌曲名,歌曲控制(播放与暂停.下一首和上一首) 操作 将下面文件下载解压后放在MP3音乐文件夹内(该文件用FLASHPACKER打包) ...
- (十八)用JAVA编写MP3解码器——迷你播放器
2019独角兽企业重金招聘Python工程师标准>>> 1.定义解码一帧的接口 ILayer123 Layer1.Layer2和Layer3这三个类都实现了ILayer123的d ...
- Vue 自定义音乐播放器组件为H5添加背景音乐
自定义音乐播放器组件为H5添加背景音乐: 1.创建music.vue组件 <template><div><div @click="changeOn" ...
最新文章
- Tom Clancy's Splinter Cell: Double Agent
- 采购计算机的,如何采购计算机
- 寻找MEET大会直播中奖的小伙伴,你有红包待领取~
- python中的引用怎么理解_Python函数通过引用调用
- 【miscellaneous】北斗短报文
- adb native raact 夜神_React Native 与 夜神模拟器的绑定
- pc css框架,PC端框架—semantic ui
- Android 视频图片 轮播,详解android 视频图片混合轮播实现
- 中文文本对齐_终于明白Word如何快速对齐姓名!为之前狂敲空格的我,留下一把泪...
- 【Gym-101775 J】Straight Master【差分、贪心】
- 玩玩直播,搭建一个流媒体服务器
- android 无损分区,有什么可行办法把安卓4.4用的tf卡第一个分区从fat32无损转换成ext4?...
- tkmybatis 枚举值处理
- EAS后台事务的超时时长如何设置?
- linux中的文件搜索命令
- word按backspace键不能删除问题
- 2019产品数据管理(PDM)技术说明
- 第二节 物料清单(BOM)
- MySQL学习笔记04-DDL语句学习
- 【SPSS】百分位数计算方法探讨:SPSS计算差异