1
\$\begingroup\$

I am learning Android with Udacity nanodegree (having no support) and this is my assignment of music app. It is just an interface and no music I have to add. So far so the app is running without any error but I wold like to get expert feedback to write code in better and optimized way to achieve the same result.

My entire project is in my Bitbucket repo.

SongAdapter.java

public class SongAdapter extends ArrayAdapter<Song> {
 int playingIndex = -1;
 boolean currentTrack = false;
 public SongAdapter(@NonNull Context context, int resource, @NonNull List<Song> objects) {
 super(context, resource, objects);
 }
 @NonNull
 @Override
 public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
 View playlistItemView = convertView;
 final ViewHolder holder;
 if (playlistItemView == null) {
 playlistItemView = LayoutInflater.from(getContext()).inflate(R.layout.playlist_item, parent, false);
 holder = new ViewHolder();
 holder.albumCoverThumbnail = playlistItemView.findViewById(R.id.playlist_album_thumbnail);
 holder.songTitle = playlistItemView.findViewById(R.id.playlist_song_title);
 holder.songAlbumTitle = playlistItemView.findViewById(R.id.playlist_song_album_title);
 holder.songArtist = playlistItemView.findViewById(R.id.playlist_song_artist);
 holder.songPlayButton = playlistItemView.findViewById(R.id.playlist_play_button);
 playlistItemView.setTag(holder);
 } else {
 holder = (ViewHolder) playlistItemView.getTag();
 }
 final Song currentSong = getItem(position);
 // set data to the list item
 assert currentSong != null;
 holder.albumCoverThumbnail.setImageResource(currentSong.getSongAlbumCoverId());
 holder.songTitle.setText(currentSong.getSongTitle());
 holder.songAlbumTitle.setText(currentSong.getSongAlbumTitle());
 holder.songArtist.setText(currentSong.getSongSingers());
 // check the play status of the song item
 if (playingIndex == position) {
 holder.songPlayButton.setImageResource(R.drawable.ic_pause_black_24dp);
 } else {
 holder.songPlayButton.setImageResource(R.drawable.ic_play_arrow_black_24dp);
 }
 // set song button action
 holder.songPlayButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 holder.songPlayButton.setImageResource(R.drawable.ic_pause_black_24dp);
 // pause current song on other click
 if (position == playingIndex) {
 playingIndex = -1;
 } else {
 playingIndex = position;
 notifyDataSetChanged();
 }
 // pause play current track
 if (currentTrack) {
 holder.songPlayButton.setImageResource(R.drawable.ic_play_arrow_black_24dp);
 currentTrack = !currentTrack;
 } else {
 holder.songPlayButton.setImageResource(R.drawable.ic_pause_black_24dp);
 }
 currentTrack = !currentTrack;
 }
 });
 return playlistItemView;
 }
 static class ViewHolder {
 ImageView albumCoverThumbnail;
 TextView songTitle;
 TextView songAlbumTitle;
 TextView songArtist;
 ImageButton songPlayButton;
 }
}
asked Dec 11, 2018 at 5:09
\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

ListView has been deprecated, a better practice would be to use RecyclerView and RecyclerView.Adapter, for more information: Android RecyclerView

answered Dec 12, 2018 at 14:10
\$\endgroup\$
1
  • 2
    \$\begingroup\$ ListView is not deprecated class or widget, you can still use it, a lot of app does. RecyclerView is usually recommended approach because better performance and clear API. \$\endgroup\$ Commented Dec 12, 2018 at 16:20

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.