如何点击recyclerView项目并转到另一个包含点击项目详细信息的recyclerView?

问题描述:

我正在创建一个音乐应用程序,我有一个“专辑”片段,它在RecyclerView中显示歌曲的专辑封面。我想要的是,当我点击任何这些项目(专辑封面)时,我应该转到另一个包含该特定专辑歌曲的活动(albumsDetails.java)。所有这些歌曲应显示在RecyclerView。 我知道如何使用意图,我已经尝试了很多东西,但都没有工作。如何点击recyclerView项目并转到另一个包含点击项目详细信息的recyclerView?

请不要低估我的问题,因为我对ANDROID STUDIO非常陌生。

Album.java

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

    recyclerViewAlbum = view.findViewById(R.id.albums_reyclerView); 
    recyclerViewAlbum.setHasFixedSize(true); 

    GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2); 
    recyclerViewAlbum.setLayoutManager(gridLayoutManager); 

    albumsAdapter = new AlbumsAdapter(SongList1,getContext(), new AlbumsAdapter.RecyclerItemClickListener() { 
     @Override 
     public void onClickListener(SongInfoModel song, int position) { 


      Intent i = new Intent(getContext(), AlbumDetails.class); 
      i.putExtra("SongName", song.getSongName()); 
      startActivity(i); 

      Activity activity = getActivity(); 
      if (activity instanceof MainActivity) {} 
     } 
    }); 

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0"; 
    Cursor cursor = getActivity().getContentResolver().query(uri, null, selection, null, null); 
    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      do { 
       String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); 
       String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); 
       long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); 
       String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
       String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
       long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 
       Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); 
       Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId); 
       SongInfoModel s = new SongInfoModel(name, artist, null, album, null, duration, data,albumArtUri); 
       SongList1.add(s); 

      } while (cursor.moveToNext()); 
     } 

     cursor.close(); 
      Collections.sort(SongList1, new Comparator<SongInfoModel>() { 
      @Override 
      public int compare(SongInfoModel lhs, SongInfoModel rhs) { 
       return lhs.getAlbum().compareTo(rhs.getAlbum()); 
      } 
     }); 
    } 

    recyclerViewAlbum.setAdapter(albumsAdapter); 
    albumsAdapter.notifyDataSetChanged(); 
    return view; 
    } 
} 

AlbumsDetails.java

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

    albumsDetails_reyclerView = findViewById(R.id.albumsDetails_reyclerView); 

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext()); 
    albumsDetails_reyclerView.setLayoutManager(linearLayoutManager); 

    Bundle extras = getIntent().getExtras(); 
    if(extras != null){ 
    } 


    albumsDetailsAdapter = new AlbumsDetailsAdapter(getApplicationContext(), SongList2, new AlbumsDetailsAdapter.RecyclerItemClickListenerAlbumsDetails() { 
     @Override 
     public void onClickListener(SongInfoModel songInfoModelAlbumDetails, int positionAlbumDetails) { 
     } 
    }){ 


    }; 
    albumsDetails_reyclerView.setAdapter(albumsDetailsAdapter); 
    albumsDetailsAdapter.notifyDataSetChanged(); 
    } 
} 
+0

在适配器内部的视图持有者类内部单击。这是从适配器获取点击的正确方法 –

内部回收站查看适配器,从ViewHolder类你可以CLL

View.setOnClickListener();

的内部recyclerview

你需要得到相册ID,并通过该专辑ID意图开始的活动,特定项目。在该活动中,使用该专辑ID并查询光标以获取与该专辑相关的歌曲。希望回答这个问题。以下是您可以用来获取allSongsViaAlbum ID的代码。

public List<SongModel> getAllSongsViaAlbumId(long albumId) throws Exception { 
    List<SongModel> songList = null; 
    if (mIsPermissionGranted) { 
     ContentResolver contentResolver = mContext.getContentResolver(); 

     Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     String selection = MediaStore.Audio.Media.ALBUM_ID + "=?"; 
     String [] whereArgs = {String.valueOf(albumId)}; 
     String sortOrder = MediaStore.Audio.Media.TITLE + " ASC"; 
     Cursor cursor = contentResolver.query(uri, null, selection, whereArgs, sortOrder); 

     if (cursor != null && cursor.moveToFirst()) { 
      songList = new ArrayList<>(); 
      int totalSongs = cursor.getCount(); 
      LogUtility.debugLog(MediaUtility.class.getSimpleName(), "Total number of audios " + totalSongs); 
      while (cursor.moveToNext()) { 
       SongModel currentSong = new SongModel(); 
       currentSong.setAlbum(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM))); 
       currentSong.setAlbumId(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))); 
       currentSong.setArtist(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))); 
       currentSong.setData(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))); 
       currentSong.setTitle(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))); 
       currentSong.setAlbumArt(getAlbumArtViaAlbumId(currentSong.getAlbumId())); 

       songList.add(currentSong); 
      } 
      cursor.close(); 
     } 
    } 
    return songList; 
} 

On Click事件使用下面的代码

Intent intent = new Intent(this, yourDesireActivity); 
    intent.putExtra("album_id", albumId); 
    startActivity(intent); 

而当新的活动开始调用getAllSongsViaAlbumId()方法,并传递你从以前的活动意图让你可以使用下面的代码来获取ID

long albumId = getIntent().getExtras().getLong("album_id") 

希望帮助你

+0

您可以为此写一段代码吗?如果您不介意 –

+0

@SebinPaul我已添加代码 –

+0

谢谢!我会研究它,让我知道如果我遇到任何问题! –

1)你需要b键从适配器到活动。

  • 其中您可以传递要在下一个回收视图中显示的模型,只需将该模型通过下一个回收视图构造函数即可。

2)在下一个回收站视图适配器中,您有模型只显示该模型的值。

注意: - 假设你知道如何给回电话。

首先,您需要了解如何声明RecyclerView适配器。这是一个非常好的教程:https://antonioleiva.com/recyclerview/

此外,您需要设置标签到列表中的每个元素,Holder.itemView.setTag(HOLDER POSITION);最后,您可以声明一个点击侦听器,您可以在其中检索标记。

public void onClick(View v) { 

       int tempid = (int) v.getTag(); 

       Intent intent = new Intent(getContext(), destination.class); 

       intent.putExtra("ID", (int) v.getTag()); 

       startActivity(intent); 

在目标类上,可以通过调用id = getIntent()。getExtras()来检索id。getInt( “ID”);