2016-07-04 7 views
0

AsyncTaskを使用してListViewのSDカードから曲をロードしようとしています。私は、アプリケーションを実行すると、何もListViewで追加されていません。 ListViewが空です。 AsyncTaskメソッドを実装していないとき、アプリケーションが動作していました。 SDカードから曲を取り込むため、2〜3秒間アプリがフリーズします。だから誰かあなたのコードでAsyncTaskメソッドを実装するように提案しました。メソッドを追加すると、ListViewが空になっています。私は自分のコードでどこで間違っているのか分かりません。コードを修正してください。提案&助けてくれてありがとう。ListViewの項目がAsyncTaskを使用してロードされていません

SongsManagerクラス

public class SongsManager { 

private static final String TAG = "songsManagerMessage"; 
final String MEDIA_PATH = Environment.getExternalStorageDirectory() .getPath() + "/"; 
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 
private String mp3Pattern = ".mp3"; 

// Constructor 
public SongsManager() { 
} 

/** * Function to read all mp3 files and store the details in * ArrayList * */ 

public ArrayList<HashMap<String, String>> getPlayList() { 
    Log.i(TAG,"getPlaylist"); 
      System.out.println(MEDIA_PATH); 
      if (MEDIA_PATH != null) { 
       File home = new File(MEDIA_PATH); 
       File[] listFiles = home.listFiles(); 
       if (listFiles != null && listFiles.length > 0) { 
        for (File file : listFiles) { 
         System.out.println(file.getAbsolutePath()); 
         if (file.isDirectory()) { 
          scanDirectory(file); 
         } else { 
          addSongToList(file); 
         } 
        } 
       } 
      } 
    return songsList; 
} 


private void scanDirectory(final File directory) { 
      if (directory != null) { 
       File[] listFiles = directory.listFiles(); 
       if (listFiles != null && listFiles.length > 0) { 
        for (File file : listFiles) { 
         if (file.isDirectory()) { 
          scanDirectory(file); 
         } else { 
          addSongToList(file); 
         } 
        } 
       } 
      } 
    Log.i(TAG,"scanDirectory"); 
} 


private void addSongToList(File song) { 
    Log.i(TAG,"scanDirectory"); 
    if (song.getName().endsWith(mp3Pattern)) { 
     HashMap<String, String> songMap = new HashMap<String, String>(); 
     songMap.put("songTitle", song.getName().substring(0, (song.getName().length() - 4))); 
     songMap.put("songPath", song.getPath()); 

     // Adding each song to SongList 
     songsList.add(songMap); 
    } 
} 
} 

GetSongsAsyncTaskクラス

public class GetSongsAsyncTask extends AsyncTask<Void,Void, List<HashMap<String, String>>> { 

private static final String TAG = "AsyncTaskMessgae"; 

private final SongsManager mSongsManager; 

public interface SongsReceivedListener { 
    void onSongsReceived(List<HashMap<String, String>> songs); 

} 

private SongsReceivedListener mSongsReceivedListener; 

public GetSongsAsyncTask(SongsReceivedListener mSongsReceivedListener) { 
    this.mSongsReceivedListener = mSongsReceivedListener; 
    mSongsManager = new SongsManager(); 
    Log.i(TAG,"GetSongsAsyncTaskMessage"); 
} 

@Override 
protected List<HashMap<String, String>> doInBackground(Void... params) { 
    Log.i(TAG,"doInBackgroundMessage"); 
    return mSongsManager.getPlayList(); 
} 


@Override 
protected void onPostExecute(List<HashMap<String, String>> v) { 
    Log.i(TAG,"onPostExecuteMessage"); 
    if(mSongsReceivedListener != null) { 
     mSongsReceivedListener.onSongsReceived(v); 
    } 
} 
} 

Tab1を断片クラス

public class Tab1 extends ListFragment implements GetSongsAsyncTask.SongsReceivedListener { 

private static final String TAG = "tab1Message"; 

// Songs list 
public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>(); 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    Log.i(TAG, "onCreateView"); 
    View V = inflater.inflate(R.layout.tab1, container, false); 
    new GetSongsAsyncTask(this).execute(); 
    return V; 
} 


@Override 
public void onSongsReceived(List<HashMap<String, String>> songs) { 
    if(getContext() == null) 
     return; 
    // looping through playlist 
for (int i = 0; i < songsList.size(); i++) { 
    // creating new HashMap 
    HashMap<String, String> song = songs.get(i); 
    // adding HashList to ArrayList 
    songsListData.add(song); 
    } 
    // Adding menuItems to ListView 
    ListAdapter adapter = new SimpleAdapter(getContext(), songsListData, 
      R.layout.playlist_item, new String[]{"songTitle"}, new int[]{ 
      R.id.songTitle}); 
    setListAdapter(adapter); 
    Log.i(TAG, "onSongsReceivedMessage"); 
} 
} 
+0

外部ストレージのアクセス権を正しく取得していて、曲のマネージャーが曲リストを正しく返していますか? – Ramesh

+0

はい。マニフェストファイルに権限を追加しました。私はコード内でAsyncTaskを実装していないときにアプリケーションが動作します。 –

+0

あなたは 'onSongsReceived'で値を取得していますか?' songs'リストのサイズを試してみてください –

答えて

0
ListAdapter adapter = new SimpleAdapter(getContext(), songsListData, 
     R.layout.playlist_item, new String[]{"songTitle"}, new int[]{ 
     R.id.songTitle}); 
setListAdapter(adapter); 
Log.i(TAG, "onSongsReceivedMessage"); 

songsListDataを曲に置き換えるだけでいいです:)

関連する問題