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
\$\begingroup\$

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

\$\endgroup\$
  • 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 Dec 12 '18 at 16:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.