本文共 5662 字,大约阅读时间需要 18 分钟。
在基于存储卡音乐播放器V0.3基础上,作如下修改:
创建方法能扫描存储卡上所有mp3文件(采用递归算法) 用自定义应用程序类存放全局数据和方法 利用异步任务来完成耗时的存储卡扫描工作package com.zjs.sdcard_music_player_v04.adapter;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import com.zjs.sdcard_music_player_v04.R;import com.zjs.sdcard_music_player_v04.entity.Music;import java.util.List;/** * 功能:音乐适配器 */public class MusicAdapter extends BaseAdapter { private Context context; // 上下文 private ListmusicList; // 音乐列表 /** * 构造方法 * * @param context * @param musicList */ public MusicAdapter(Context context, List musicList) { this.context = context; this.musicList = musicList; } @Override public int getCount() { return musicList.size(); } @Override public Object getItem(int position) { return musicList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // 声明视图容器 ViewHolder holder = null; // 判断转换视图是否为空 if (convertView == null) { // 将列表项模板映射成转换视图 convertView = LayoutInflater.from(context).inflate(R.layout.music_name_list_item, null); // 创建视图容器对象 holder = new ViewHolder(); // 实例化转换视图里的控件 holder.tvMusicName = convertView.findViewById(R.id.tvMusicName); // 将视图容器附加到转换视图 convertView.setTag(holder); } else { // 从转换视图里取出视图容器 holder = (ViewHolder) convertView.getTag(); } // 获取列表项要显示的数据 Music music = musicList.get(position); // 设置列表项控件的属性(去掉路径和扩展名) holder.tvMusicName.setText(music.getMusicName().substring( music.getMusicName().lastIndexOf("/") + 1, music.getMusicName().lastIndexOf("."))); // 返回转换视图 return convertView; } /** * 视图容器 */ private static class ViewHolder { TextView tvMusicName; }}
package com.zjs.sdcard_music_player_v04.entity;/** * 功能:音乐实体类 */public class Music { private String musicName; // 音乐名 public String getMusicName() { return musicName; } public void setMusicName(String musicName) { this.musicName = musicName; } @Override public String toString() { return "Music{" + "musicName='" + musicName + '\'' + '}'; }}
package com.zjs.sdcard_music_player_v04.app;import android.app.Application;import android.os.Environment;import com.zjs.sdcard_music_player_v04.entity.Music;import java.io.File;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;/** * 功能:音乐播放器应用程序类 */public class MusicPlayerApplication extends Application { private SimpleDateFormat sdf; // 简单日期格式 @Override public void onCreate() { super.onCreate(); // 实例化简单日期格式 sdf = new SimpleDateFormat("mm:ss"); } /** * 获取格式化时间 * * @param time 单位是毫秒 * @return mm:ss格式的时间 */ public String getFormatTime(int time) { return sdf.format(time); } /** * 生成指定目录下某种类型的文件列表 * * @param dir * @param suffix * @param typeFileList */ public void makeTypeFileList(File dir, String suffix, ListtypeFileList) { // 获取指定目录下的File数组(File既可以指向目录,也可以指向文件) File[] files = dir.listFiles(); // 遍历File数组 for (File file : files) { // 判断file是否是文件 if (file.isFile()) { // file是文件 // 按照后缀来过滤文件 if (file.getName().endsWith(suffix)) { // 将满足条件的文件添加到文件列表 typeFileList.add(file.getAbsolutePath()); } } else { // file是目录 // 目录非空,递归调用 if (file.list() != null) { makeTypeFileList(file, suffix, typeFileList); } } } } /** * 获取音乐列表 * * @return 音乐列表 */ public List getMusicList() { // 声明音乐列表 List musicList = null; // 获取外置存储卡根目录 File sdRootDir = Environment.getExternalStorageDirectory(); // 创建后缀字符串 String suffix = ".mp3"; // 创建音乐文件列表 List musicFileList = new ArrayList<>(); // 调用方法,生成指定目录下某种类型文件列表 makeTypeFileList(sdRootDir, suffix, musicFileList); // 判断音乐文件列表里是否有元素 if (musicFileList.size() > 0) { // 实例化音乐列表 musicList = new ArrayList<>(); // 遍历音乐文件列表 for (String musicFile : musicFileList) { // 创建音乐实体 Music music = new Music(); // 设置实体属性 music.setMusicName(musicFile); // 将音乐实体添加到音乐列表 musicList.add(music); } } // 返回音乐列表 return musicList; }}
此版本是v0.2个版本中优化得来,以上便是此次总结
转载地址:http://fjtki.baihongyu.com/