将音乐文件从gallery加载到android中的“我的文件夹”
我正在用安卓系统制作自己的音乐播放器。我想把所有的音乐文件从gallery加载到我的文件夹中,这样我就可以将其中的一些添加到我的收藏夹中。但是,问题是,当我从图库中获取文件时,它会重复。这个列表在我的文件夹中显示了三四次。你能检查一下是否有逻辑错误吗??谢谢:)将音乐文件从gallery加载到android中的“我的文件夹”,android,audio-player,android-music-player,Android,Audio Player,Android Music Player,我正在用安卓系统制作自己的音乐播放器。我想把所有的音乐文件从gallery加载到我的文件夹中,这样我就可以将其中的一些添加到我的收藏夹中。但是,问题是,当我从图库中获取文件时,它会重复。这个列表在我的文件夹中显示了三四次。你能检查一下是否有逻辑错误吗??谢谢:) 首先通过以下步骤检查ArrayList(即文件列表)是否包含任何重复值 public ArrayList<String> getFromSdcard(String folderName) { ArrayLis
首先通过以下步骤检查ArrayList(即文件列表)是否包含任何重复值
public ArrayList<String> getFromSdcard(String folderName) {
ArrayList<String> audioFileLists = new ArrayList<String>();
File file = new File(Environment.getExternalStorageDirectory()+"/"+folderName);
if (file.isDirectory()) {
File[] listFile = file.listFiles();// get list of files
for (int i = 0; i < listFile.length; i++) {
String path = listFile[i].getAbsolutePath();
audioFileLists.add(path);// add path of files to array list
}
}
Log.d("audioFileLists:" + audioFileLists.size(), ""); // Check the Size of the List
return audioFileLists;
}
public ArrayList getFromSdcard(字符串folderName){
ArrayList AudioFileList=新建ArrayList();
File File=新文件(Environment.getExternalStorageDirectory()+“/”+folderName);
if(file.isDirectory()){
File[]listFile=File.listFiles();//获取文件列表
for(int i=0;i
并打印AudioFileList中的值,以确保arraylist不包含重复的值
public void print(ArrayList<String> audioFileLists) {
for (int i = 0; i < audioFileLists.size(); i++) {
System.out.println("files:" + audioFileLists.get(i));
}
}
public void打印(ArrayList音频文件列表){
对于(int i=0;i
如果ArrayList包含重复项,请使用以下方法从ArrayList中删除重复项,我们可以使用哈希集删除ArrayList的重复项,如下所示
public ArrayList<String> removeDuplicates(ArrayList<String> audioFileLists){
HashSet<String> listToSet = new HashSet<String>(
audioFileLists);
audioFileLists.clear();
audioFileLists.addAll(listToSet);
return audioFilesLists;
}
public ArrayList removeDuplicates(ArrayList音频文件列表){
HashSet listToSet=新HashSet(
音频文件列表);
audioFileLists.clear();
audioFileLists.addAll(listToSet);
返回音频文件列表;
}
现在,您可以再次调用上面编写的print方法,以确保删除重复项。如果ArrayList没有重复项,那么问题在于Adpater的使用
众所周知,适配器的工作是为数据集中的每个元素准备要在ListView中显示的视图。这往往涉及许多findViewById(int)查找,这在CPU时间上非常昂贵,而且我相信这里会出现重复
Android的长期最佳实践规定,适配器使用一种称为ViewHolder模式的东西来降低这些查找的成本,并消除重复问题
我已经在这里解释了如何使用视图保持器模式
public class MusicAdapter extends BaseAdpater{
private ArrayList<String> audioFile;
LayoutInflater mInflater =null;
public MusicAdapter( ArrayList<String> audioFiles,Context dcontextObject) {
audioFile = audioFiles;
mInflater = LayoutInflater.from(dcontextObject);
}
public int getCount() {
return audioFile.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// Create an Object for View Holder
ViewHolder holder;
if(convertView == null){
convertView = mInflater.inflate(R.layout.musiclist, null);
holder.albumName = (TextView) convertView.findViewById(R.id.albumName);
}
else{
holder = (ViewHolder) convertView .getTag();
}
holder.albumName.setText(fileName.substring(audioFile.get(position).lastIndexOf("/")+1));
return convertView;
}// End of getView()
// create View Holder class here
class ViewHolder {
TextView albumName;
}
}// End of Adapter
公共类MusicAdapter扩展了BaseADater{
私有ArrayList音频文件;
LayoutInflater mInflater=null;
公共音乐播放器(ArrayList音频文件、上下文dcontextObject){
音频文件=音频文件;
mInflater=LayoutInflater.from(dcontextObject);
}
public int getCount(){
返回audioFile.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
//为视图保持架创建对象
视窗座;
如果(convertView==null){
convertView=mInflater.inflate(R.layout.musiclist,null);
holder.albumName=(TextView)convertView.findViewById(R.id.albumName);
}
否则{
holder=(ViewHolder)convertView.getTag();
}
holder.albumName.setText(fileName.substring(audioFile.get(position.lastIndexOf(“/”+1));
返回视图;
}//getView()的结尾
//在此处创建视图持有者类
类视图持有者{
文本视图名称;
}
}//适配器端部
@Tonny:请使用Log语句找出您在getFromSdCard()中检索到的文件总数,还可以发布您初始化baseAdapter对象的方式。private MusicAdapter MusicAdapter=null;musicAdapter=新的musicAdapter(文件列表);folderList.setAdapter(musicAdapter);您是否检查了ArrayList是否包含任何重复的值,我是说文件列表是否包含任何重复的值?请确认吗?当然。。也许这就是问题所在。但如何解决这个问题呢?别误会。我在android的初级阶段。这就是为什么(没问题,托尼,请检查我的答案兄弟我非常抱歉我的兄弟。我的系统昨天卡住了,被迫再次格式化。这就是为什么我无法与你联系。感谢你的时间和帮助我的兄弟。但是,当我使用此持视图器时,似乎应用程序正在强制关闭,并收到一条错误消息:“无法在第一次布局后获得viewwidth”:(很抱歉,回复太晚了:(没问题,Tony,您可以通过查看日志来发布视图持有者问题的堆栈跟踪吗?11-12 11:14:27.313:W/webcore(513):无法在第一次布局后获得viewwidth 11-12 11:14:27.413:D/webviewglue(513):nativeDestroy视图:0x3053b8 11-12 11:14:27.423:I/Ads(513):onReceiveAd()11-12 11:14:27.523:D/webviewglue(513):nativeDestroy视图:0x32d048 11-12 11:15:05.163:D/Dalvikm(513):GC_在中显式释放6162个对象/466624字节111ms@Tony:你能在gist中发布代码吗,这样我就可以在我的机器中运行并测试它,了解这个错误?我们不能在没有Viewholder的情况下执行该功能吗?从文档中,我知道在listview中加载内容将是一种刺激。还有一个疑问,即这是回路中的逻辑错误吗?我想回路是连续的
public ArrayList<String> removeDuplicates(ArrayList<String> audioFileLists){
HashSet<String> listToSet = new HashSet<String>(
audioFileLists);
audioFileLists.clear();
audioFileLists.addAll(listToSet);
return audioFilesLists;
}
public class MusicAdapter extends BaseAdpater{
private ArrayList<String> audioFile;
LayoutInflater mInflater =null;
public MusicAdapter( ArrayList<String> audioFiles,Context dcontextObject) {
audioFile = audioFiles;
mInflater = LayoutInflater.from(dcontextObject);
}
public int getCount() {
return audioFile.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// Create an Object for View Holder
ViewHolder holder;
if(convertView == null){
convertView = mInflater.inflate(R.layout.musiclist, null);
holder.albumName = (TextView) convertView.findViewById(R.id.albumName);
}
else{
holder = (ViewHolder) convertView .getTag();
}
holder.albumName.setText(fileName.substring(audioFile.get(position).lastIndexOf("/")+1));
return convertView;
}// End of getView()
// create View Holder class here
class ViewHolder {
TextView albumName;
}
}// End of Adapter