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; } } 
\$\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

    \$\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\$
      – 3mpty
      CommentedDec 12, 2018 at 16:20

    Start asking to get answers

    Find the answer to your question by asking.

    Ask question

    Explore related questions

    See similar questions with these tags.