2017-08-28 2 views
0

私はクリックすると同じアルバムのすべての曲をdinamicallyコールするアルバムの部分にExpandableListViewを作成しました。私は閉じて、アルバムの声を再び開いたときに問題が来る: enter image description here(Android)のアイテムがExpandableListViewに複製されました

をそして私は...なぜ他のアルバムをクリックすると、それが続く:私は一度クリックしたときに enter image description here

そして、ここでは私のログですか?ここに私のコードは次のとおりです。 SongLoader.java

public ArrayList<Song> loadSongsByAlbum(String albumSelected, String method){ 
    Log.d("ALBUM SELECTED: ", albumSelected+" BY METHOD: "+method); 
    Song mSong; 
    String selection = MediaStore.Audio.Media.ALBUM + " = '"+albumSelected+"' "; 
    String orderBy = MediaStore.Audio.Media.TITLE + " ASC"; 
    Uri allSongsUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    String[] projection = new String[]{ 
      MediaStore.Audio.Media._ID, 
      MediaStore.Audio.Media.TITLE, 
      MediaStore.Audio.Media.ARTIST, 
      MediaStore.Audio.Media.ALBUM, 
      MediaStore.Audio.Media.DURATION, 
      MediaStore.Audio.Media.TRACK, 
      MediaStore.Audio.Media.ARTIST_ID, 
      MediaStore.Audio.Media.ALBUM_ID 
    }; 

    mCursor = mContext.getContentResolver().query(allSongsUri, projection, selection, null, orderBy); 

    if(mCursor != null && mCursor.moveToFirst()){ 
     do{ 
      long id = mCursor.getLong(0); 
      String title = mCursor.getString(1); 
      String artist = mCursor.getString(2); 
      String album = mCursor.getString(3); 
      int duration = mCursor.getInt(4); 
      int trackNumber = mCursor.getInt(5); 
      long artistId = mCursor.getInt(6); 
      long albumId = mCursor.getLong(7); 

      mSong = new Song(id, albumId, artistId, title, artist, album, duration, trackNumber); 
      mSongList.add(mSong); 
     }while(mCursor.moveToNext()); 
     mCursor.close(); 
     mCursor = null; 
    } 
    return mSongList; 
} 

AlbumFragment.java

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    mContext = container.getContext(); 
    mInflater = inflater; 
    mContainer = container; 
    checkAlbumList(); 
    return mRootView; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     AlbumLoader sl = new AlbumLoader(getContext()); 
     mAlbumList = sl.loadAlbums(); 
} 

public void checkAlbumList(){ 
    if((mAlbumList == null) || mAlbumList.isEmpty()){ 
     mRootView = mInflater.inflate(R.layout.error_no_tracks, mContainer, false); 
    } else showAlbums(); 
} 

public void showAlbums(){ 
    mRootView = mInflater.inflate(R.layout.fragment_album, mContainer, false); 

    ExpandableListView mExpList = (ExpandableListView) mRootView.findViewById(R.id.listview_album); 
    mExpList.setDivider(null); 

    ExpandableAlbumListAdapter mExpAdapter = new ExpandableAlbumListAdapter(getContext(), mAlbumList); 
    mExpList.setAdapter(mExpAdapter); 
    mExpAdapter.notifyDataSetChanged(); 
} 

}

はExpandableAlbumListAdapter.java

public class ExpandableAlbumListAdapter extends BaseExpandableListAdapter { 
private Context mContext; 
private ArrayList<Song> mSongChildList; 
private ArrayList<Album> mAlbumList; 
private SongLoader songLoader; 

public ExpandableAlbumListAdapter(Context cx, ArrayList<Album> albumData){ 
    this.mContext = cx; 
    this.mAlbumList = albumData; 
    songLoader = new SongLoader(mContext); 
} 


@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(LyricaUtils.getAlbumArtUri(albumView.albumID).toString(), mAlbumCover); 

    return convertView; 
} 

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

    mSongChildList = songLoader.loadSongsByAlbum(mAlbumList.get(groupPosition).albumTitle, "getChildView"); 
    TextView mSongTitle = (TextView) convertView.findViewById(R.id.album_track_child); 
    mSongTitle.setText(mSongChildList.get(childPosition).songTitle); 
    return convertView; 
} 

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

@Override 
public int getChildrenCount(int groupPosition) { 
    Album albumPos = mAlbumList.get(groupPosition); 
    mSongChildList = songLoader.loadSongsByAlbum(albumPos.albumTitle, "getChildrenCount"); 
    return this.mSongChildList.size(); 
} 

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

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

@Override 
public Object getChild(int groupPosition, int childPosition) { 
    Album albumPos = mAlbumList.get(groupPosition); 
    mSongChildList = songLoader.loadSongsByAlbum(albumPos.albumTitle, "getChild"); 
    Song songPos = mSongChildList.get(childPosition); 
    notifyDataSetChanged(); 
    return songPos; 
} 

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

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

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

}

+0

https://stackoverflow.com/questions/19568961/duplicates-in-my-expandablelistview-adapter –

+0

「songLoader.loadSongsByAlbum(albumPos.albumTitle、 "getChildrenCount")はどのように動作しますか?問題はおそらくそれにあります。 –

答えて

0

これを試してください。

@Override 
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.item_album_track, parent, false); 
    } 
    if (mSongChildList != null && mSongChildList.size() > 0) { 
     mSongChildList.clear(); 
    } 
    mSongChildList = songLoader.loadSongsByAlbum(mAlbumList.get(groupPosition).albumTitle, "getChildView"); 
    TextView mSongTitle = (TextView) convertView.findViewById(R.id.album_track_child); 
    mSongTitle.setText(mSongChildList.get(childPosition).songTitle); 
    return convertView; 
} 

私は問題があなたのmSongChildListは決してクリアされていないと思います。しかし、getChildViewでこれを避け、代わりにmSongChildListをアダプタのコンストラクタに渡すことをお勧めします。

関連する問題