2013-11-11 3 views
0

Я был на пути к созданию собственного музыкального плеера в андроиде. Я хочу загрузить все музыкальные файлы из галереи в свою папку, чтобы добавить некоторые из них в свои избранные. Но проблема в том, что, когда я получаю файлы из галереи, она делает повторение. то есть. список отображается трижды или четыре раза в моей папке. Можете ли вы проверить, есть ли какая-либо логическая ошибка? Спасибо :)Загрузка музыкальных файлов из галереи в мою папку в 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.

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 
+0

@Tonny: используйте Log заявление, чтобы узнать общее количество файлов, как вы извлекли в вашем getFromSdCard(), а также пожалуйста, вы можете разместить так, как вы инициализировать baseAdapter объект. –

+0

private MusicAdapter musicAdapter = null; musicAdapter = новый MusicAdapter (список файлов); folderList.setAdapter (musicAdapter); – Tony

+0

Вы проверили, что ваш ArrayList содержит любые повторяющиеся значения, я имею в виду, что в списках файлов есть дубликат?, Пожалуйста, подтвердите сопряжение? –

ответ

1

Сначала проверьте погоду ваш 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; 
    } 

и печати значений в 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, мы можем удалить дубликаты Ar rayList с использованием Hashset, как показано ниже.

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

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

и теперь снова можно вызвать метод печати, который мы писали выше, чтобы гарантировать, что дубликаты removed.if ArrayList не имеет дубликат, то проблема с использованием Adpater.

Как хорошо известно, задача адаптера заключается в подготовке представлений, отображаемых в ListView для каждого элемента в наборе данных. Это, как правило, связано с множеством поисковых запросов findViewById (int), которые довольно дорогостоящие в процессорном времени, а также я считаю, что здесь происходит дублирование.

Настоящие рекомендации для 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 
+0

Мне очень жаль моего брата. Моя система вчера застряла и была вынуждена отформатировать это еще раз. Вот почему я не могу с вами связаться. Спасибо за ваше время и помогите моему брату.Но, когда я использую этот зритель, кажется, что приложение закрывает силу и получает сообщение об ошибке «Невозможно получить ширину просмотров после первого макета» :(Извините за поздний ответ :( – Tony

+0

Без проблем Тони, не могли бы вы опубликовать его трассировку стека для этой проблемы с View Holder, увидев ваш Logcat? –

+0

11-12 11: 14: 27.313: W/webcore (513): не удается получить вид ширины после первого макета 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 освободил 6162 объекта/466624 байта в 111 мс – Tony

Смежные вопросы