-2

J'ai une ArrayList remplie d'objets Song et j'ai essayé de la convertir en HashMap en utilisant leur nom Album comme clé. Malheureusement, chaque parent du groupe montre toutes les chansons et chaque tutoriel recommande de diviser la arrayList afin de grouper les éléments par parent de groupe, alors que puis-je faire? Voici mon code: AlbumFragment.javaExpandableListView avec une ArrayList déjà définie d'éléments

public void showAlbums(){ 
    mRootView = mInflater.inflate(R.layout.fragment_album, mContainer, false); 
    mListView = (ExpandableListView) mRootView.findViewById(R.id.listview_album); 
    SongLoader sl = new SongLoader(mContext); 
    final ArrayList<Song> mSongsList = sl.loadSongs(); 
    HashMap<String, List<Song>> mHashSongs = new HashMap<String, List<Song>>(); 

    for(Song song : mSongsList){ 
      mHashSongs.put(song.songAlbum, mSongsList); //I guess the main problem is just here 
    } 

    final ExpandableAlbumListAdapter mAdapter = new ExpandableAlbumListAdapter(getContext(), mAlbumList, mHashSongs); 
    mListView.setAdapter(mAdapter); 
    mListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { 
     @Override 
     public void onGroupExpand(int groupPosition) { 
      Toast.makeText(getContext(), "List OPENED:"+mAlbumList.get(groupPosition).albumTitle, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

ExpandableAlbumListAdapter.java

public class ExpandableAlbumListAdapter extends BaseExpandableListAdapter { 
private Context mContext; 
private ArrayList<Album> mAlbumList; 
private HashMap<String, List<Song>> mHashChild; 

public ExpandableAlbumListAdapter(Context cx, ArrayList<Album> albumData, HashMap<String, List<Song>> songData){ 
    this.mContext = cx; 
    this.mAlbumList = albumData; 
    this.mHashChild = songData; 
} 

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
    if(convertView == null){ 
     LayoutInflater inflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.item_album, parent, false); 
    } 

    Album albumView = mAlbumList.get(groupPosition); 

    TextView mAlbumTitle = (TextView) convertView.findViewById(R.id.album_title); 
    TextView mAuthorName = (TextView) convertView.findViewById(R.id.album_artist); 
    TextView mTracksNumb = (TextView) convertView.findViewById(R.id.album_tracks); 
    ImageView mAlbumCover = (ImageView) convertView.findViewById(R.id.album_cover); 

    mAlbumTitle.setText(albumView.albumTitle); 
    mAuthorName.setText(albumView.albumArtist); 
    mTracksNumb.setText(""+albumView.albumNumTracks); 
    ImageLoader.getInstance().displayImage(AppUtils.getAlbumArtUri(albumView.albumID).toString(), mAlbumCover); 

    return convertView; 
} 

@Override 
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
    final Song childText = (Song) getChild(groupPosition, childPosition); 
    if(convertView == null){ 
     LayoutInflater inflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.item_album_track, parent, false); 
    } 

    Log.d("test song picked", ""+mHashChild.values()); 
    TextView mSongTitle = (TextView) convertView.findViewById(R.id.album_track_child); 
    mSongTitle.setText(childText.songTitle); 
    return convertView; 
} 

@Override 
public int getGroupCount() { 
    return mAlbumList.size(); 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return this.mHashChild.get(mAlbumList.get(groupPosition).albumTitle).size(); 
} 

@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return this.mAlbumList.get(groupPosition).albumTitle; 
} 

@Override 
public Object getChild(int groupPosition, int childPosition) { 
    return this.mHashChild.get(this.mAlbumList.get(groupPosition).albumTitle).get(childPosition); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return childPosition; 
} 

@Override 
public boolean hasStableIds() { 
    return false; 
} 
} 

Répondre

1

Votre code de chansons de groupe par album est incorrect. Vous avez écrit:

final ArrayList<Song> mSongsList = sl.loadSongs(); 
HashMap<String, List<Song>> mHashSongs = new HashMap<String, List<Song>>(); 

for(Song song : mSongsList){ 
     mHashSongs.put(song.songAlbum, mSongsList); 
} 

Ce code itérer sur chaque chanson mSongsList un par un, et ajoutez une entrée à mHashSongs de l'album de la chanson à mSongsList. Les chances sont très bonnes que vous ne vouliez pas dire put()mSongsList.

Qu'est-ce que vous voulez sans doute faire est:

  • get() la liste des chansons associées à un album
  • si cette liste est null, créez un nouveau et put() dans la carte
  • add() la chanson à cette liste

Dans le code:

for (Song song : mSongsList) { 
     List<Song> songsByAlbum = mHashSongs.get(song.songAlbum); 

     if (songsByAlbum == null) { 
      songsByAlbum = new ArrayList<>(); 
      mHashSongs.put(song.songAlbum, songsByAlbum); 
     } 

     songsByAlbum.add(song); 
    } 
+0

Cela a très bien fonctionné, merci beaucoup! :) – Sabatino