3

I building a music player that has a tab layout. One of the tabs is "Genres"(Genre.java) that displays the genres of songs in RecyclerView( songs that are present on the external storage of the android phone, by querying it). I have set onClickListeners too for the genres in the RecyclerView. So, when I click one the genres it should take me to another activity (GenresSongs.java) that displays all the song belonging to that clicked genre.

My problem:

When I click any of the genres, it takes me to another activity but it displays the song that was last added to the array. No matter which genre I click it takes me to the same song.

What I want:

When I click one of genres in the list it should take me to the song that belongs to the clicked genre. I hope you are getting my point. I'm passing GenreID as intent.

Genre.java(class that displays the genre of all the songs) :

public class Genres extends Fragment {


private static final String TAG = "Genres";
RecyclerView recyclerView_genre;
GenresAdapter genresAdapter;
ArrayList<GenresModel> Genrelist = new ArrayList<>();
Cursor genrecursor;
long id;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.genres_activity, container, false);

    recyclerView_genre = view.findViewById(R.id.recyclerView_genre);
    LinearLayoutManager genreLayout = new LinearLayoutManager(getContext());
    recyclerView_genre.setLayoutManager(genreLayout);


    final Uri uri = MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI;




    genrecursor = getActivity().getContentResolver().query(uri,null,null, null, null);

    if (genrecursor != null) {
        if (genrecursor.moveToFirst()) {
            do {

                id = genrecursor.getLong(genrecursor.getColumnIndex(MediaStore.Audio.Genres._ID));
                String name = genrecursor.getString(genrecursor.getColumnIndex(MediaStore.Audio.Genres.NAME));

                GenresModel genresModel = new GenresModel(id,name);
                Genrelist.add(genresModel);



                Collections.sort(Genrelist, new Comparator<GenresModel>() {
                    @Override
                    public int compare(GenresModel lhs, GenresModel rhs) {
                        return lhs.getGenreName().compareTo(rhs.getGenreName());
                    }
                });

            } while (genrecursor.moveToNext());
        }
        genrecursor.close();
    }






    genresAdapter = new GenresAdapter(getContext(), Genrelist, new GenresAdapter.GenreItemClickListener() {
        @Override
        public void onClickListener(GenresModel genresModel, int GenrePosition) {

            Intent nIntent  = new Intent(getContext(), GenresSong.class);
            nIntent.putExtra("genre_ID", id);
            startActivity(nIntent);

        }
    });

    recyclerView_genre.setAdapter(genresAdapter);
    genresAdapter.notifyDataSetChanged();


    return view;
}

GenresAdapter.java(the adapter class of Genres.java):

 public class GenresAdapter extends RecyclerView.Adapter<GenresAdapter.GenresHolder> {

private Context gContext;
private ArrayList<GenresModel>  GenreList = new ArrayList<>();
private GenreItemClickListener listenerGenre;


public GenresAdapter(Context gContext, ArrayList<GenresModel> genreList, GenresAdapter.GenreItemClickListener listenerGenre) {
    this.gContext = gContext;
    GenreList = genreList;
    this.listenerGenre = listenerGenre;

}

@Override
public GenresAdapter.GenresHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view3 = LayoutInflater.from(gContext).inflate(R.layout.row_genre, parent, false);
    return new GenresHolder(view3);
}

@Override
public void onBindViewHolder(GenresAdapter.GenresHolder holder, int position) {

    final GenresModel genresModel1 = GenreList.get(position);

    holder.genreText.setText( genresModel1.getGenreName());

    holder.bindSong(genresModel1, listenerGenre);

}

@Override
public int getItemCount() {
    return GenreList.size();
}

public class GenresHolder extends RecyclerView.ViewHolder {

    TextView genreText;

    public GenresHolder(View itemView) {
        super(itemView);

        genreText = itemView.findViewById(R.id.genreText);
    }

    public void bindSong(final GenresModel genresModel1, final GenreItemClickListener listenerGenre) {

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                listenerGenre.onClickListener(genresModel1, getLayoutPosition());

            }
        });

    }
}

public interface GenreItemClickListener{

     void onClickListener(GenresModel genresModel, int GenrePosition);
}

GenresSong.java(class that is supposed to display songs when genre is clicked):

public class GenresSong extends Activity {


RecyclerView recyclerView_genreSong;
ArrayList <GenreSongModel> GenreSongList = new ArrayList<>();
GenresSongAdapter genresSongAdapter;
long genreID;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.genres_details);

    recyclerView_genreSong = findViewById(R.id.recyclerView_genreSong);
    LinearLayoutManager l1 = new LinearLayoutManager(getApplicationContext());
    recyclerView_genreSong.setLayoutManager(l1);

    genreID = getIntent().getExtras().getLong("genre_ID");


    Uri uri = MediaStore.Audio.Genres.Members.getContentUri("external", genreID);

    String[] projection ={MediaStore.Audio.Media.TITLE};

    Cursor cursor = getApplicationContext().getContentResolver().query(uri, projection, null, null, null);

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {



                String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));


                GenreSongModel s = new GenreSongModel(name);
                GenreSongList.add(s);


            } while (cursor.moveToNext());
        }


        cursor.close();

        Collections.sort(GenreSongList, new Comparator<GenreSongModel>() {
            @Override
            public int compare(GenreSongModel lhs, GenreSongModel rhs) {
                return lhs.getSongName().compareTo(rhs.getSongName());
            }
        });



    }




    genresSongAdapter = new GenresSongAdapter(getApplicationContext(), GenreSongList);

    recyclerView_genreSong.setAdapter(genresSongAdapter);
    genresSongAdapter.notifyDataSetChanged();

}

GenresSongAdapter.java(adapter class for GenresSong.java):

public class GenresSongAdapter extends RecyclerView.Adapter<GenresSongAdapter.GenresSongHolder> {

Context gsContext;
ArrayList<GenreSongModel> GenresSongList2 = new ArrayList<>();


public GenresSongAdapter(Context gsContext, ArrayList<GenreSongModel> genresSongList2) {
    this.gsContext = gsContext;
    GenresSongList2 = genresSongList2;
}

@Override
public GenresSongAdapter.GenresSongHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v5 = LayoutInflater.from(gsContext).inflate(R.layout.row_genredetails, parent, false);
    return new GenresSongHolder(v5);
}



@Override
public void onBindViewHolder(GenresSongAdapter.GenresSongHolder holder, int position) {

    GenreSongModel genreSongModel = GenresSongList2.get(position);

    holder.genreSongName.setText(genreSongModel.getSongName());



}

@Override
public int getItemCount() {
    return GenresSongList2.size();
}

public class GenresSongHolder extends RecyclerView.ViewHolder {

    TextView genreSongName;

    public GenresSongHolder(View itemView) {
        super(itemView);

        genreSongName = itemView.findViewById(R.id.genreSongName);
    }


}
Rektirino
  • 582
  • 5
  • 24
  • "No matter which genre I click it takes me to the same song." – In the `GenresAdapter` click listener, you're attaching `id` to the `Intent` - `nIntent.putExtra("genre_ID", id);` - but you never update `id`'s value there, so it's always 0. – Mike M. Oct 20 '17 at 22:18
  • Yeah I fixed it by calling getGenreID() – Rektirino Oct 22 '17 at 03:08

0 Answers0