Android简易音乐重构MVVM Java版-新增推荐、雷达歌单详情列表界面(十八)

  • 关于
  • 效果
    • 修改ApiService
    • 增加歌单列表实体类RecommendListEntity
    • 新增歌单列表界面
    • 新增MinePlayListViewModel.java
    • 修改Constant
    • 修改MinePlayListActivity(歌单界面)
    • 修改推荐歌单适配器RecommendAdapter
    • 修改雷达歌单适配器MgcAdapter

关于

  本篇主要实现首页发现中推荐歌单和雷达歌单的点击跳转歌单列表界面和播放功能。
简易音乐app仅作为学习用,禁止用于商业及非法用途,如产生法律纠纷与本人无关

效果

修改ApiService

  增加歌单详情接口

 @GET("playlist/detail")//获取歌单详情列表LiveData<ApiResponse<RecommendListEntity>> getPlayList(@Query("id") long creativeId);

增加歌单列表实体类RecommendListEntity

@NoArgsConstructor
@Data
public class RecommendListEntity {private int code;private Object relatedVideos;private PlaylistEntity playlist;private Object urls;private List<PrivilegesEntity> privileges;private Object sharedPrivilege;private Object resEntrance;@NoArgsConstructor@Datapublic static class PlaylistEntity {private long id;private String name;private long coverImgId;private String coverImgUrl;private String coverImgId_str;private int adType;private long userId;private long createTime;private int status;private boolean opRecommend;private boolean highQuality;private boolean newImported;private long updateTime;private int trackCount;private int specialType;private int privacy;private long trackUpdateTime;private String commentThreadId;private long playCount;private long trackNumberUpdateTime;private int subscribedCount;private int cloudTrackCount;private boolean ordered;private String description;private List<String> tags;private Object updateFrequency;private long backgroundCoverId;private Object backgroundCoverUrl;private long titleImage;private Object titleImageUrl;private Object englishTitle;private Object officialPlaylistType;private List<SubscribersEntity> subscribers;private boolean subscribed;private CreatorEntity creator;private List<TracksEntity> tracks;private Object videoIds;private Object videos;private List<TrackIdsEntity> trackIds;private int shareCount;private int commentCount;private Object remixVideo;private Object sharedUsers;private Object historySharedUsers;private String gradeStatus;private Object score;private Object algTags;@NoArgsConstructor@Datapublic static class CreatorEntity {private boolean defaultAvatar;private int province;private int authStatus;private boolean followed;private String avatarUrl;private int accountStatus;private int gender;private int city;private int birthday;private long userId;private int userType;private String nickname;private String signature;private String description;private String detailDescription;private long avatarImgId;private long backgroundImgId;private String backgroundUrl;private int authority;private boolean mutual;private List<String> expertTags;private ExpertsEntity experts;private int djStatus;private int vipType;private Object remarkName;private int authenticationTypes;private AvatarDetailEntity avatarDetail;private String avatarImgIdStr;private String backgroundImgIdStr;private boolean anchor;private String avatarImgId_str;@NoArgsConstructor@Datapublic static class ExpertsEntity {@SerializedName("1")private String _$1;@SerializedName("2")private String _$2;}@NoArgsConstructor@Datapublic static class AvatarDetailEntity {private int userType;private int identityLevel;private String identityIconUrl;}}@NoArgsConstructor@Datapublic static class SubscribersEntity {private boolean defaultAvatar;private int province;private int authStatus;private boolean followed;private String avatarUrl;private int accountStatus;private int gender;private int city;private int birthday;private long userId;private int userType;private String nickname;private String signature;private String description;private String detailDescription;private long avatarImgId;private long backgroundImgId;private String backgroundUrl;private int authority;private boolean mutual;private Object expertTags;private Object experts;private int djStatus;private int vipType;private Object remarkName;private int authenticationTypes;private Object avatarDetail;private String avatarImgIdStr;private String backgroundImgIdStr;private boolean anchor;private String avatarImgId_str;}@NoArgsConstructor@Datapublic static class TracksEntity {private String name;private int id;private int pst;private int t;private List<ArEntity> ar;private List<String> alia;private int pop;private int st;private String rt;private int fee;private int v;private Object crbt;private String cf;private AlEntity al;private int dt;private HEntity h;private MEntity m;private LEntity l;private Object sq;private Object hr;private Object a;private String cd;private int no;private Object rtUrl;private int ftype;private List<?> rtUrls;private int djId;private int copyright;private int s_id;private long mark;private int originCoverType;private Object originSongSimpleData;private Object tagPicList;private boolean resourceState;private int version;private Object songJumpInfo;private Object entertainmentTags;private int single;private Object noCopyrightRcmd;private Object alg;private int mst;private int cp;private int mv;private int rtype;private Object rurl;private long publishTime;@NoArgsConstructor@Datapublic static class AlEntity {private int id;private String name;private String picUrl;private List<?> tns;private String pic_str;private long pic;}@NoArgsConstructor@Datapublic static class HEntity {private int br;private int fid;private int size;private int vd;private int sr;}@NoArgsConstructor@Datapublic static class MEntity {private int br;private int fid;private int size;private int vd;private int sr;}@NoArgsConstructor@Datapublic static class LEntity {private int br;private int fid;private int size;private int vd;private int sr;}@NoArgsConstructor@Datapublic static class ArEntity {private int id;private String name;private List<?> tns;private List<?> alias;}}@NoArgsConstructor@Datapublic static class TrackIdsEntity {private int id;private int v;private int t;private long at;private Object alg;private long uid;private String rcmdReason;private Object sc;}}@NoArgsConstructor@Datapublic static class PrivilegesEntity {private int id;private int fee;private int payed;private int realPayed;private int st;private int pl;private int dl;private int sp;private int cp;private int subp;private boolean cs;private int maxbr;private int fl;private Object pc;private boolean toast;private int flag;private boolean paidBigBang;private boolean preSell;private int playMaxbr;private int downloadMaxbr;private String maxBrLevel;private String playMaxBrLevel;private String downloadMaxBrLevel;private String plLevel;private String dlLevel;private String flLevel;private Object rscl;private FreeTrialPrivilegeEntity freeTrialPrivilege;private List<ChargeInfoListEntity> chargeInfoList;@NoArgsConstructor@Datapublic static class FreeTrialPrivilegeEntity {private boolean resConsumable;private boolean userConsumable;private Object listenType;}@NoArgsConstructor@Datapublic static class ChargeInfoListEntity {private int rate;private Object chargeUrl;private Object chargeMessage;private int chargeType;}}
}

新增歌单列表界面

  新增页面activity_mine_play_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"tools:context=".ui.daily.MinePlayListActivity"><com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/app_bar"android:layout_width="match_parent"android:layout_height="@dimen/app_bar_height"android:fitsSystemWindows="true"android:theme="@style/Theme.PersonalMusic.AppBarOverlay"><com.google.android.material.appbar.CollapsingToolbarLayoutandroid:id="@+id/toolbar_layout"style="@style/Widget.MaterialComponents.Toolbar.Primary"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"app:contentScrim="?attr/colorPrimary"app:layout_scrollFlags="scroll|exitUntilCollapsed"app:toolbarId="@+id/toolbar"><ImageViewandroid:id="@+id/img_bg"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_collapseMode="parallax"/><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_gravity="top"android:layout_width="match_parent"android:layout_height="@dimen/dp_45"app:layout_collapseMode="pin"><includeandroid:id="@+id/title"layout="@layout/ui_common_play_title"app:layout_collapseMode="pin"/></androidx.appcompat.widget.Toolbar></com.google.android.material.appbar.CollapsingToolbarLayout></com.google.android.material.appbar.AppBarLayout><include layout="@layout/content_scrolling"android:id="@+id/content"/></androidx.coordinatorlayout.widget.CoordinatorLayout>

  对应content_scrolling.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:context=".ui.daily.MinePlayListActivity"tools:showIn="@layout/activity_mine_play_list"><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:id="@+id/rv_play_top"android:layout_width="match_parent"android:layout_height="@dimen/dp_40"app:layout_constraintTop_toTopOf="parent"tools:ignore="RtlSymmetry"><TextViewandroid:id="@+id/img_play"android:layout_width="@dimen/dp_24"android:layout_height="@dimen/dp_24"android:layout_centerVertical="true"android:layout_marginStart="@dimen/dp_13"android:background="@drawable/ic_daily_play_all" /><TextViewandroid:id="@+id/daily_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginStart="@dimen/dp_8"android:layout_toEndOf="@+id/img_play"android:gravity="center"android:text="@string/daily_play"android:textColor="@color/pureBlack"android:textSize="@dimen/sp_18"android:textStyle="bold" /></RelativeLayout><ImageViewandroid:id="@+id/img_loading"android:layout_width="@dimen/dp_40"android:layout_height="@dimen/dp_40"android:layout_marginTop="@dimen/dp_50"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toBottomOf="@id/rv_play_top"/><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_play_list"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_constraintTop_toBottomOf="@id/rv_play_top"android:orientation="vertical"/></androidx.constraintlayout.widget.ConstraintLayout></androidx.core.widget.NestedScrollView>

新增MinePlayListViewModel.java

public class MinePlayListViewModel extends ViewModel {private SavedStateHandle state;public Long currentPlayId = 0L;public MinePlayListViewModel(SavedStateHandle savedStateHandle) {this.state = savedStateHandle;}public LiveData<ApiResponse<RecommendListEntity>> getPlayList(){return RetrofitUtils.getmApiUrl().getPlayList(currentPlayId);}
}

修改Constant

public static final String PLAYLIST_ID = "PLAYLIST_ID";public static final String PLAY_NAME = "PLAY_NAME";

修改MinePlayListActivity(歌单界面)

public class MinePlayListActivity extends BaseActivity {private ActivityMinePlayListBinding binding;private MinePlayListViewModel viewModel;private PlayListAdapter adapter;private ArrayList<MusicInfo> songList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMinePlayListBinding.inflate(getLayoutInflater());viewModel  = new ViewModelProvider(this).get(MinePlayListViewModel.class);setContentView(binding.getRoot());viewModel.currentPlayId = getIntent().getLongExtra(PLAYLIST_ID,0L);loadGif();initRecycle();initObserver();initView();}private void loadGif() {Glide.with(this).asGif().load(R.drawable.play_list_loading).diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(binding.content.imgLoading);}private void initView() {binding.content.rvPlayTop.setOnClickListener(v -> {if (ClickUtil.enableClick()){MusicPlay.playMusicByList(songList,0);startActivity(new Intent(this, CurrentSongPlayActivity.class).putExtra(MUSIC_INFO,songList.get(0)));}});binding.title.ivBack.setOnClickListener(view -> {if (ClickUtil.enableClick()){finish();}});binding.title.tvTitle.setText(getIntent().getStringExtra(PLAY_NAME));}private void initRecycle() {adapter = new PlayListAdapter(this);LinearLayoutManager manager = new LinearLayoutManager(this);manager.setOrientation(LinearLayoutManager.VERTICAL);binding.content.rvPlayList.setLayoutManager(manager);binding.content.rvPlayList.setAdapter(adapter);binding.content.rvPlayList.setHasFixedSize(true);}private void initObserver() {viewModel.getPlayList().observe(this, playList -> {ViewExtensionKt.printLog(playList.getMessage());if (playList.getStatus() == Status.SUCCESS){binding.content.imgLoading.setVisibility(View.GONE);adapter.setDataList(playList.getData().getPlaylist().getTracks());for (RecommendListEntity.PlaylistEntity.TracksEntity data:playList.getData().getPlaylist().getTracks()){MusicInfo musicInfo = new MusicInfo();musicInfo.setSongId(String.valueOf(data.getId()));musicInfo.setSongUrl(Constant.SONG_URL+data.getId());musicInfo.setSongCover(data.getAl().getPicUrl());musicInfo.setSongName(data.getName());musicInfo.setArtist(data.getAr().get(0).getName());songList.add(musicInfo);}}});}
}

修改推荐歌单适配器RecommendAdapter

holder.itemView.setOnClickListener(view -> {if (ClickUtil.enableClick()){mContext.startActivity(new Intent(mContext, MinePlayListActivity.class).putExtra(PLAYLIST_ID,Long.valueOf(bean.getCreativeId())).putExtra(PLAY_NAME,bean.getUiElement().getMainTitle().getTitle()));}});

修改雷达歌单适配器MgcAdapter

 holder.itemView.setOnClickListener(view -> {if (ClickUtil.enableClick()){mContext.startActivity(new Intent(mContext, MinePlayListActivity.class).putExtra(PLAYLIST_ID,Long.valueOf(bean.getCreativeId())).putExtra(PLAY_NAME,bean.getUiElement().getMainTitle().getTitle()));}});

  本篇到此结束了,有问题欢迎批评指正,觉得不错的也请点个赞

Android简易音乐重构MVVM Java版-新增推荐、雷达歌单详情列表界面(十八)相关推荐

  1. Android简易音乐重构MVVM Java版-新增推荐雷达歌单及重构首页(十三)

    Android简易音乐重构MVVM Java版-新增推荐雷达歌单及重构首页(十三) 关于 效果图 修改ApiService 添加HomeDiscoverEntity实体类 添加BannerExtInf ...

  2. Android简易音乐重构MVVM Java版-新增推荐菜单及侧边栏展示(十二)

    Android简易音乐重构MVVM Java版-新增推荐菜单及侧边栏展示(十二) 关于 效果图 添加侧边栏 添加推荐歌单 新增RecommendAdapter适配器 修改DiscoverFragmen ...

  3. Android简易音乐重构MVVM Java版-新增歌曲播放界面+状态栏黑科技(十七)

    Android简易音乐重构MVVM Java版-新增歌曲播放界面(十七) 关于 效果 新增歌曲播放界面 增加歌词view `LyricView` 修改ApiService 添加引用 添加SongPla ...

  4. Android简易音乐重构MVVM Java版 -搭建项目(八)

    Android简易音乐重构MVVM Java版 -搭建项目(八) 关于 新版本配置 网易云音乐api版本更新 重构代码 新建app类继承Application 项目结构 定义BaseActivity. ...

  5. 网易云音乐歌单详情列表爬虫破解

    这次我跟大家分享的是关于爬虫加密破解的技术! 由于工作开发的需求,后台需要爬取网易云歌单详情页面(http://music.163.com/#/playlist?id=867413461)的歌单歌曲列 ...

  6. 解决网页版网易云别人歌单只能听二十首

    f12 打开console(控制台) 输入document.cookie="os=pc"即可

  7. 音乐歌单Android,[CloudReader]Android - 仿网易云音乐歌单详情页

    前段时间模仿网易云音乐UI使用DataBinding做了一个App:CloudReader,今天把其中的类似歌单详情页单独拿出来说一下,我觉得其中还是有些干货的,关联到的知识点还比较有价值,而且也有很 ...

  8. 仿网易云android界面,Android - 仿网易云音乐歌单详情页

    前段时间模仿网易云音乐UI使用DataBinding做了一个App:CloudReader,今天把其中的类似歌单详情页单独拿出来说一下,我觉得其中还是有些干货的,关联到的知识点还比较有价值,而且也有很 ...

  9. 微信小程序之网易云音乐(五)- 排行详情页、歌单详情页、播放器组件开发

    微信小程序之网易云音乐(五)- 排行详情页.歌单详情页.播放器组件开发 一. 排行详情页模块 二. 歌单详情页模块 三. 播放器组件 微信小程序之网易云音乐导航 一. 排行详情页模块 rank.vue ...

最新文章

  1. ORA-00257 解决办法
  2. 通俗易懂的Redis数据结构基础教程
  3. java nio 强制关闭_netty 处理远程主机强制关闭一个连接
  4. SharePoint:如何设置某个页面必须由站点集管理员打开
  5. VTK:Utilities之Timer
  6. ABAP SAPGUI 里使用 F4 value help 选择时间
  7. DAVY的神龙帕夫——读者的心灵故事|十二橄榄枝的传说
  8. 网卡驱动:stmmac DMA发送流程
  9. TCP/UDP的接收缓冲区和发送缓冲区
  10. 黑客观察手机倾斜角度就能猜出你的密码,首次命中率高达74%!
  11. 用vue手脚架生成的项目直接修改时.vue文件后,保存编译就报一大堆的错,这是咋回事呢?
  12. tensorflow随笔——LeNet网络
  13. HTML 列表 olullidldtdd
  14. PAIP.ASP重复INCLUDE包含引起的重定义错误解决方案
  15. hyperterminal停止工作_hyper terminal超级终端最新下载
  16. 汽车CAN通信协议整理
  17. C#报错Newtonsoft.Json.JsonSerializationException: “A member with the name ‘phone‘ already
  18. 游戏对战平台研究终结篇【转】
  19. 特殊字符--百度百科
  20. python + selenium:怎么实现控制左右滑动开关

热门文章

  1. JavaScript中callee和caller的用法解读
  2. php json 压缩传输,详解PHP如何将返回的JSON数据用gzip压缩输出
  3. 湖北文理学院工程能力实训开班!
  4. Struts框架_4 常用标签表单
  5. xcode error: use of undeclared identifier ‘free‘
  6. 特征值问题误差分析:Babuska–Osborn紧算子谱逼近理论
  7. FFmpeg:浅谈 AVFrame 结构体
  8. 深入理解Modbus通讯
  9. 西门子 SCL 语言 模拟量转换小例程
  10. 计算光学成像(COI)实验室技能——matlab控制thorlabs位移平台(ActiveX控件)