将音乐文件从库加载到我在android中的文件夹

时间:2013-11-11 06:13:09

标签: android audio-player android-music-player

我正在创建一个我自己的Android音乐播放器。我想要将所有音乐文件从库加载到我的文件夹,以便我可以将其中一些添加到我的收藏夹中。但是,问题是,当我从图库中获取文件时,它会重复。即。列表在我的文件夹中显示三次或四次。你能检查一下是否有任何逻辑错误?谢谢你:)

public ArrayList<String> getFromSdcard(String folderName)
{
    ArrayList<String> audioFileLists = new ArrayList<String>();
    File file=  new File(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
        }
    }
    return audioFileLists;
}

private class MusicAdapter extends BaseAdapter {
    private  ArrayList<String> audioFile;

    public MusicAdapter( ArrayList<String> audioFiles) {
        audioFile = audioFiles;
    }

    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) {
        System.gc();

        LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView =  mInflater.inflate(R.layout.musiclist, null);
        TextView albumName = (TextView) convertView.findViewById(R.id.albumName);           
        String fileName = audioFile.get(position);
        albumName.setText(fileName.substring(fileName.lastIndexOf("/")+1));
        return convertView;
    }
}

尝试使用ViewHold后,这是我的logcat。

11-12 11:14:26.043: I/Ads(513): Request scenario: Online server request.
11-12 11:14:27.313: W/webcore(513): Can't get the viewWidth after the first layout
11-12 11:14:27.413: D/webviewglue(513): nativeDestroy view: 0x3053b8
11-12 11:14:27.423: I/Ads(513): onReceiveAd()
11-12 11:14:27.523: D/webviewglue(513): nativeDestroy view: 0x32d048
11-12 11:15:05.163: D/dalvikvm(513): GC_EXPLICIT freed 6162 objects / 466624 bytes in 111ms
11-12 11:28:53.443: D/dalvikvm(513): GC_FOR_MALLOC freed 20535 objects / 582840 bytes in 124ms
11-12 11:42:38.213: D/dalvikvm(513): GC_FOR_MALLOC freed 20821 objects / 523728 bytes in 117ms
11-12 11:56:20.473: D/dalvikvm(513): GC_FOR_MALLOC freed 20837 objects / 524536 bytes in 129ms

1 个答案:

答案 0 :(得分:1)

首先检查您的ArrayList,即fileLists不包含任何重复值,如下所示

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;
    }

并打印audioFileLists中的值以确保您的arraylist不包含重复值

public void print(ArrayList<String> audioFileLists) {
        for (int i = 0; i < audioFileLists.size(); i++) {
            System.out.println("files:" + audioFileLists.get(i));
        }
    }

如果ArrayList包含重复,请使用以下方法从ArrayList中删除重复项,我们可以使用Hashset删除ArrayList的副本,如下所示。

public ArrayList<String> removeDuplicates(ArrayList<String> audioFileLists){

HashSet<String> listToSet = new HashSet<String>(
                audioFileLists);
        audioFileLists.clear();
        audioFileLists.addAll(listToSet);
       return audioFilesLists;
}

现在再次调用我们上面写的print方法以确保删除重复项。如果ArrayList没有重复,则问题在于使用Adpater。

众所周知,适配器的工作是准备要在ListView中显示的数据集中每个元素的视图。这往往涉及许多findViewById(int)查找,这些查询在CPU时间上非常昂贵,而且我相信这里发生了重复。

适用于Android的常规最佳实践规定,适配器使用称为ViewHolder模式的东西来降低这些查找的成本,并消除重复问题。

我在这里解释了如何使用View Holder模式。

        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