将音乐文件从gallery加载到android中的“我的文件夹”

将音乐文件从gallery加载到android中的“我的文件夹”,android,audio-player,android-music-player,Android,Audio Player,Android Music Player,我正在用安卓系统制作自己的音乐播放器。我想把所有的音乐文件从gallery加载到我的文件夹中,这样我就可以将其中的一些添加到我的收藏夹中。但是,问题是,当我从图库中获取文件时,它会重复。这个列表在我的文件夹中显示了三四次。你能检查一下是否有逻辑错误吗??谢谢:) 首先通过以下步骤检查ArrayList(即文件列表)是否包含任何重复值 public ArrayList<String> getFromSdcard(String folderName) { ArrayLis

我正在用安卓系统制作自己的音乐播放器。我想把所有的音乐文件从gallery加载到我的文件夹中,这样我就可以将其中的一些添加到我的收藏夹中。但是,问题是,当我从图库中获取文件时,它会重复。这个列表在我的文件夹中显示了三四次。你能检查一下是否有逻辑错误吗??谢谢:)


首先通过以下步骤检查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