|
|
|
|
@ -45,48 +45,81 @@ import butterknife.BindView;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Created by 残渊 on 2018/11/21.
|
|
|
|
|
* 这个类表示搜索内容展示的Fragment,用于展示搜索歌曲或专辑的结果,
|
|
|
|
|
* 具备加载数据、处理下拉刷新和上拉加载更多、与播放服务交互以及响应相关事件等功能,
|
|
|
|
|
* 遵循MVP模式,实现了ISearchContentContract.View接口定义的视图相关操作规范,
|
|
|
|
|
* 同时继承自BaseLoadingFragment,可能具备一些基础的加载相关的功能和属性。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
public class SearchContentFragment extends BaseLoadingFragment<SearchContentPresenter> implements ISearchContentContract.View {
|
|
|
|
|
private static final String TAG = "SearchContentFragment";
|
|
|
|
|
// 用于区分搜索类型的键值,在传递和获取参数时作为标识,表明是歌曲还是专辑等类型的搜索
|
|
|
|
|
public static final String TYPE_KEY = "type";
|
|
|
|
|
// 用于传递搜索内容的键值,在传递和获取参数时作为标识,存储用户输入的搜索关键字等信息
|
|
|
|
|
public static final String SEEK_KEY = "seek";
|
|
|
|
|
// 用于标识是否在线的键值(从代码中看可能未完整体现其使用场景,也许用于区分在线资源相关逻辑)
|
|
|
|
|
public static final String IS_ONLINE = "online";
|
|
|
|
|
// 用于记录当前搜索结果的页码偏移量,初始化为1,用于实现翻页搜索功能,每次加载更多数据时递增
|
|
|
|
|
private int mOffset = 1; //用于翻页搜索
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 搜索内容的Presenter对象,用于处理业务逻辑,如发起搜索请求、获取更多数据等,遵循MVP模式
|
|
|
|
|
private SearchContentPresenter mPresenter;
|
|
|
|
|
|
|
|
|
|
// 用于管理RecyclerView布局的线性布局管理器,设置列表的布局方式(如垂直排列等)
|
|
|
|
|
private LinearLayoutManager manager;
|
|
|
|
|
// 搜索内容的适配器,负责将搜索结果数据(歌曲或专辑列表数据)绑定到RecyclerView的每个Item视图上进行展示,并处理相关点击等交互逻辑
|
|
|
|
|
private SearchContentAdapter mAdapter;
|
|
|
|
|
// 存储搜索到的歌曲列表数据的集合,初始化为空的ArrayList,后续从获取的数据中添加元素并展示
|
|
|
|
|
private ArrayList<SearchSong.DataBean.SongBean.ListBean> mSongList = new ArrayList<>();
|
|
|
|
|
// 存储搜索到的专辑列表数据的集合,初始化为null,后续根据搜索结果赋值并用于展示相关专辑信息
|
|
|
|
|
private List<Album.DataBean.AlbumBean.ListBean> mAlbumList;
|
|
|
|
|
// 用于支持RecyclerView下拉刷新和上拉加载更多功能的适配器,对原始的mAdapter进行包装,添加相关功能支持
|
|
|
|
|
private LRecyclerViewAdapter mLRecyclerViewAdapter;//下拉刷新
|
|
|
|
|
|
|
|
|
|
// 通过ButterKnife框架绑定的RecyclerView视图组件,用于展示搜索结果列表,支持下拉刷新和上拉加载更多功能
|
|
|
|
|
@BindView(R.id.normalView)
|
|
|
|
|
LRecyclerView mRecycler;
|
|
|
|
|
// 通过ButterKnife框架绑定的ImageView视图组件,可能用于显示背景图片等相关用途(从代码中未明确体现具体使用场景)
|
|
|
|
|
@BindView(R.id.iv_background)
|
|
|
|
|
ImageView mBackgroundIv;
|
|
|
|
|
|
|
|
|
|
// 用于接收从外部传入的参数Bundle,可能包含了搜索类型、搜索内容等相关数据,用于在Fragment内部传递和使用
|
|
|
|
|
private Bundle mBundle;
|
|
|
|
|
// 用于存储搜索内容的字符串,从传入的Bundle中获取,代表用户输入的搜索关键字等信息
|
|
|
|
|
private String mSeek;
|
|
|
|
|
// 用于存储搜索类型的字符串,从传入的Bundle中获取,表明是歌曲还是专辑等类型的搜索
|
|
|
|
|
private String mType;
|
|
|
|
|
|
|
|
|
|
// 用于与播放服务进行交互的Binder对象,通过它可以调用播放服务中的方法,如控制播放等操作
|
|
|
|
|
private PlayerService.PlayStatusBinder mPlayStatusBinder;
|
|
|
|
|
|
|
|
|
|
// 定义与播放服务的连接对象,用于监听服务的连接与断开状态,并获取服务提供的Binder对象进行交互
|
|
|
|
|
private ServiceConnection connection = new ServiceConnection() {
|
|
|
|
|
/**
|
|
|
|
|
* 当与服务成功连接时调用,获取服务提供的IBinder对象,并强转为对应的PlayStatusBinder类型,
|
|
|
|
|
* 以便后续调用播放服务中的方法进行播放控制等操作
|
|
|
|
|
* @param name 连接的服务的组件名称
|
|
|
|
|
* @param service 服务返回的IBinder对象
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void onServiceConnected(ComponentName name, IBinder service) {
|
|
|
|
|
mPlayStatusBinder = (PlayerService.PlayStatusBinder) service;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 当与服务意外断开连接时调用,这里暂时没有具体实现逻辑,可根据需求添加相关处理,
|
|
|
|
|
* 比如重新尝试连接、提示用户等操作
|
|
|
|
|
* @param name 断开连接的服务的组件名称
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void onServiceDisconnected(ComponentName name) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 在Fragment中加载数据的方法,根据搜索类型(歌曲或专辑)调用Presenter的相应搜索方法发起初始搜索请求,
|
|
|
|
|
* 同时调用searchMore方法设置上拉加载更多相关逻辑。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void loadData() {
|
|
|
|
|
if (mType.equals("song")) {
|
|
|
|
|
@ -97,6 +130,11 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
searchMore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重新加载数据的方法,调用父类的reload方法(可能有一些基础的重新加载相关逻辑)后,
|
|
|
|
|
* 根据搜索类型(歌曲或专辑)再次调用Presenter的相应搜索方法发起搜索请求,
|
|
|
|
|
* 一般用于在需要刷新数据的场景下使用,例如出现网络问题重新尝试加载等情况。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void reload() {
|
|
|
|
|
super.reload();
|
|
|
|
|
@ -107,43 +145,75 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取Fragment对应的布局资源ID,返回fragment_search_content布局资源的ID,
|
|
|
|
|
* 表明该Fragment加载对应的这个布局文件来展示界面内容。
|
|
|
|
|
* @return 布局资源ID,即R.layout.fragment_search_content
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected int getLayoutId() {
|
|
|
|
|
return R.layout.fragment_search_content;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 初始化视图相关操作的方法,先调用父类的initView方法(可能有一些基础的视图初始化逻辑),
|
|
|
|
|
* 然后注册到EventBus用于接收事件,从传入的Bundle中获取搜索内容和搜索类型参数,
|
|
|
|
|
* 同时创建线性布局管理器,并启动播放服务并进行绑定,用于后续与播放服务的交互操作。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void initView() {
|
|
|
|
|
super.initView();
|
|
|
|
|
// 注册当前Fragment到EventBus,用于接收事件(例如歌曲在线状态变化、歌曲版权相关事件等,用于更新界面等操作)
|
|
|
|
|
EventBus.getDefault().register(this);
|
|
|
|
|
mBundle = getArguments();
|
|
|
|
|
if (mBundle != null) {
|
|
|
|
|
if (mBundle!= null) {
|
|
|
|
|
mSeek = mBundle.getString(SEEK_KEY);
|
|
|
|
|
mType = mBundle.getString(TYPE_KEY);
|
|
|
|
|
}
|
|
|
|
|
manager = new LinearLayoutManager(mActivity);
|
|
|
|
|
//启动服务
|
|
|
|
|
// 创建启动播放服务的Intent对象,指定要启动的服务类为PlayerService
|
|
|
|
|
Intent playIntent = new Intent(getActivity(), PlayerService.class);
|
|
|
|
|
// 绑定播放服务,通过传入的ServiceConnection对象监听服务连接状态,
|
|
|
|
|
// 并设置绑定模式为自动创建服务(如果服务未启动则自动启动)
|
|
|
|
|
mActivity.bindService(playIntent, connection, Context.BIND_AUTO_CREATE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取与当前Fragment关联的搜索内容Presenter对象,创建一个SearchContentPresenter实例并返回,
|
|
|
|
|
* 以符合MVP模式中视图与Presenter的交互要求,确保Presenter能处理相关业务逻辑并与视图进行通信。
|
|
|
|
|
* @return 返回搜索内容Presenter对象,即创建的SearchContentPresenter实例
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected SearchContentPresenter getPresenter() {
|
|
|
|
|
mPresenter = new SearchContentPresenter();
|
|
|
|
|
return mPresenter ;
|
|
|
|
|
return mPresenter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 订阅EventBus的事件,当接收到OnlineSongChangeEvent类型的事件时,
|
|
|
|
|
* 如果适配器不为空,则调用适配器的方法通知数据集已改变,
|
|
|
|
|
* 可能用于更新歌曲列表等界面展示内容(例如歌曲在线状态变化等情况导致需要更新显示)。
|
|
|
|
|
* @param event 接收到的OnlineSongChangeEvent事件对象
|
|
|
|
|
*/
|
|
|
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
|
|
|
public void onOnlineSongChangeEvent(OnlineSongChangeEvent event){
|
|
|
|
|
if(mAdapter!= null) mAdapter.notifyDataSetChanged();
|
|
|
|
|
public void onOnlineSongChangeEvent(OnlineSongChangeEvent event) {
|
|
|
|
|
if (mAdapter!= null) mAdapter.notifyDataSetChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 订阅EventBus的事件,当接收到OnlineSongErrorEvent类型的事件时,
|
|
|
|
|
* 显示一个Toast提示信息给用户,告知歌曲可能存在版权问题,提示用户搜索其他歌曲。
|
|
|
|
|
* @param event 接收到的OnlineSongErrorEvent事件对象
|
|
|
|
|
*/
|
|
|
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
|
|
|
|
public void onOnlineSongErrorEvent(OnlineSongErrorEvent event){
|
|
|
|
|
public void onOnlineSongErrorEvent(OnlineSongErrorEvent event) {
|
|
|
|
|
showToast("抱歉该歌曲暂没有版权,搜搜其他歌曲吧");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 当Fragment被销毁时调用,进行一些清理操作,如解除与播放服务的绑定、注销在EventBus的注册等,
|
|
|
|
|
* 避免内存泄漏等问题,释放相关资源。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void onDestroy() {
|
|
|
|
|
super.onDestroy();
|
|
|
|
|
@ -151,7 +221,12 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
EventBus.getDefault().unregister(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置歌曲列表数据,将传入的歌曲列表数据添加到已有的歌曲列表集合中,
|
|
|
|
|
* 创建搜索内容适配器并进行相关配置,将适配器设置给RecyclerView用于展示歌曲列表,
|
|
|
|
|
* 同时为歌曲列表的每个Item设置点击事件监听,点击时进行一系列歌曲相关信息的设置和获取歌曲播放地址等操作。
|
|
|
|
|
* @param songListBeans 搜索到的歌曲列表数据集合
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void setSongsList(final ArrayList<SearchSong.DataBean.SongBean.ListBean> songListBeans) {
|
|
|
|
|
mSongList.addAll(songListBeans);
|
|
|
|
|
@ -160,23 +235,28 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
mRecycler.setLayoutManager(manager);
|
|
|
|
|
mRecycler.setAdapter(mLRecyclerViewAdapter);
|
|
|
|
|
|
|
|
|
|
//点击播放
|
|
|
|
|
// 为歌曲列表的适配器设置点击事件监听,点击某个歌曲Item时执行以下逻辑
|
|
|
|
|
SearchContentAdapter.setItemClick(position -> {
|
|
|
|
|
SearchSong.DataBean.SongBean.ListBean dataBean = mSongList.get(position);
|
|
|
|
|
Song song = new Song();
|
|
|
|
|
song.setSongId(dataBean.getSongmid());
|
|
|
|
|
song.setSinger(getSinger(dataBean));
|
|
|
|
|
song.setSongName(dataBean.getSongname());
|
|
|
|
|
song.setImgUrl(Api.ALBUM_PIC+dataBean.getAlbummid()+Api.JPG);
|
|
|
|
|
song.setImgUrl(Api.ALBUM_PIC + dataBean.getAlbummid() + Api.JPG);
|
|
|
|
|
song.setDuration(dataBean.getInterval());
|
|
|
|
|
song.setOnline(true);
|
|
|
|
|
song.setMediaId(dataBean.getStrMediaMid());
|
|
|
|
|
song.setDownload(DownloadUtil.isExistOfDownloadSong(dataBean.getSongmid()));
|
|
|
|
|
//网络获取歌曲地址
|
|
|
|
|
// 调用Presenter的方法获取歌曲的播放地址,用于后续播放操作
|
|
|
|
|
mPresenter.getSongUrl(song);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 当上拉加载更多歌曲数据成功时调用,将新获取到的歌曲列表数据添加到已有的歌曲列表集合中,
|
|
|
|
|
* 然后通知适配器数据集已改变,同时通知RecyclerView上拉加载更多操作完成,更新界面显示状态。
|
|
|
|
|
* @param songListBeans 新获取到的歌曲列表数据集合
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void searchMoreSuccess(ArrayList<SearchSong.DataBean.SongBean.ListBean> songListBeans) {
|
|
|
|
|
mSongList.addAll(songListBeans);
|
|
|
|
|
@ -184,11 +264,20 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
mRecycler.refreshComplete(Constant.OFFSET);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 当上拉加载更多歌曲数据出现错误时调用,设置RecyclerView不再允许上拉加载更多(可能显示相应提示给用户),
|
|
|
|
|
* 告知用户已经没有更多数据可加载了。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void searchMoreError() {
|
|
|
|
|
mRecycler.setNoMore(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置上拉加载更多相关逻辑,先禁用RecyclerView的下拉刷新功能(可能根据业务需求只允许上拉加载更多),
|
|
|
|
|
* 然后为RecyclerView设置上拉加载更多的监听事件,在用户上拉时增加页码偏移量并根据搜索类型调用Presenter的相应方法获取更多数据,
|
|
|
|
|
* 同时设置底部加载提示的颜色和文字提示信息,用于给用户展示加载相关的状态提示。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void searchMore() {
|
|
|
|
|
|
|
|
|
|
@ -202,13 +291,17 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
mPresenter.searchAlbumMore(mSeek, mOffset);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
//设置底部加载颜色
|
|
|
|
|
// 设置底部加载提示的背景颜色、进度条颜色和文字颜色(具体颜色资源通过对应的R.color资源引用获取)
|
|
|
|
|
mRecycler.setFooterViewColor(R.color.colorAccent, R.color.musicStyle_low, R.color.transparent);
|
|
|
|
|
//设置底部加载文字提示
|
|
|
|
|
// 设置底部加载文字提示信息,分别对应正在加载、加载完成、加载出错时的提示文本内容
|
|
|
|
|
mRecycler.setFooterViewHint("拼命加载中", "已经全部为你呈现了", "网络不给力啊,点击再试一次吧");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置网络错误时上拉加载更多的相关逻辑,为RecyclerView设置网络错误监听事件,
|
|
|
|
|
* 在出现网络错误后用户点击重试时,增加页码偏移量并调用Presenter的相应方法再次尝试获取更多数据。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void showSearcherMoreNetworkError() {
|
|
|
|
|
mRecycler.setOnNetWorkErrorListener(() -> {
|
|
|
|
|
@ -217,17 +310,12 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void searchAlbumSuccess(final List<Album.DataBean.AlbumBean.ListBean> albumList) {
|
|
|
|
|
mAlbumList = new ArrayList<>();
|
|
|
|
|
mAlbumList.addAll(albumList);
|
|
|
|
|
mAdapter = new SearchContentAdapter(mAlbumList, mSeek, getActivity(), Constant.TYPE_ALBUM);
|
|
|
|
|
mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter);
|
|
|
|
|
mRecycler.setLayoutManager(manager);
|
|
|
|
|
mRecycler.setAdapter(mLRecyclerViewAdapter);
|
|
|
|
|
SearchContentAdapter.setAlbumClick(position -> toAlbumContentFragment(mAlbumList.get(position)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 当搜索专辑数据成功时调用,创建专辑列表数据集合并添加获取到的专辑数据,
|
|
|
|
|
* 创建搜索内容适配器并进行相关配置,将适配器设置给RecyclerView用于展示专辑列表,
|
|
|
|
|
* 同时为专辑列表的每个Item设置点击事件监听,点击时跳转到专辑内容展示的Fragment(通过调用toAlbumContentFragment方法)。
|
|
|
|
|
* @param albumList 搜索到的专辑列表数据集合
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void searchAlbumMoreSuccess(List<Album.DataBean.AlbumBean.ListBean> songListBeans) {
|
|
|
|
|
mAlbumList.addAll(songListBeans);
|
|
|
|
|
@ -235,23 +323,34 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
mRecycler.refreshComplete(Constant.OFFSET);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 当搜索专辑数据出现错误时调用,通过工具类显示一个Toast提示信息给用户,告知获取专辑信息失败。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void searchAlbumError() {
|
|
|
|
|
CommonUtil.showToast(getActivity(), "获取专辑信息失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 当获取歌曲播放地址成功时调用,将获取到的播放地址设置到歌曲对象中,
|
|
|
|
|
* 然后保存歌曲相关信息(可能保存到本地数据库或者其他存储方式,具体看FileUtil.saveSong的实现),
|
|
|
|
|
* 最后通过与播放服务交互的Binder对象,调用播放服务中的在线播放方法开始播放歌曲。
|
|
|
|
|
* @param song 歌曲对象,包含了歌曲的各种相关信息(如ID、名称、歌手等)
|
|
|
|
|
* @param url 获取到的歌曲播放地址字符串
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void getSongUrlSuccess(Song song,String url) {
|
|
|
|
|
public void getSongUrlSuccess(Song song, String url) {
|
|
|
|
|
song.setUrl(url);
|
|
|
|
|
FileUtil.saveSong(song);
|
|
|
|
|
mPlayStatusBinder.playOnline();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构造带参数的fragment
|
|
|
|
|
*
|
|
|
|
|
* @param type 参数
|
|
|
|
|
* 构造带参数的fragment的静态工厂方法,用于创建SearchContentFragment实例,
|
|
|
|
|
* 并传入搜索内容和搜索类型参数,将参数封装到Bundle中设置给Fragment实例,方便根据不同情况创建并配置Fragment。
|
|
|
|
|
* @param seek 搜索内容的字符串,代表用户输入的搜索关键字等信息
|
|
|
|
|
* @param type 搜索类型的字符串,表明是歌曲还是专辑等类型的搜索
|
|
|
|
|
* @return 返回创建好的SearchContentFragment实例
|
|
|
|
|
*/
|
|
|
|
|
public static Fragment newInstance(String seek, String type) {
|
|
|
|
|
SearchContentFragment fragment = new SearchContentFragment();
|
|
|
|
|
@ -262,25 +361,38 @@ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPres
|
|
|
|
|
return fragment;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 跳转到专辑内容展示的Fragment的方法,获取Activity的Fragment管理器,开启一个Fragment事务,
|
|
|
|
|
* 设置Fragment切换的动画效果,将专辑内容的Fragment添加到指定的容器布局(R.id.fragment_container)中,
|
|
|
|
|
* 同时隐藏当前Fragment,并将事务添加到返回栈,以便用户可以通过返回键回到当前Fragment,最后提交事务完成切换操作。
|
|
|
|
|
* @param album 专辑相关的数据对象,包含了专辑的各种信息(如专辑ID、名称、封面图片、歌手、发行时间等),
|
|
|
|
|
* 用于传递给专辑内容Fragment展示相应专辑的详细信息。
|
|
|
|
|
*/
|
|
|
|
|
public void toAlbumContentFragment(Album.DataBean.AlbumBean.ListBean album) {
|
|
|
|
|
FragmentManager manager = getActivity().getSupportFragmentManager();
|
|
|
|
|
FragmentTransaction transaction = manager.beginTransaction();
|
|
|
|
|
// 设置Fragment进入和退出的动画效果,分别对应进入、退出、从右侧进入、从右侧退出的动画资源ID
|
|
|
|
|
transaction.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.slide_in_right, R.anim.slide_out_right);
|
|
|
|
|
transaction.add(R.id.fragment_container, AlbumContentFragment.
|
|
|
|
|
newInstance(album.getAlbumMID(), album.getAlbumName(), album.getAlbumPic(), album.getSingerName(), album.getPublicTime()));
|
|
|
|
|
transaction.hide(this);
|
|
|
|
|
//将事务提交到返回栈
|
|
|
|
|
// 将事务添加到返回栈,按下返回键时可以按照添加顺序反向执行事务,实现返回上一个Fragment的效果
|
|
|
|
|
transaction.addToBackStack(null);
|
|
|
|
|
transaction.commit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取歌曲的歌手信息,因为一首歌曲可能存在多个歌手,所以将多个歌手名字拼接成一个字符串返回,
|
|
|
|
|
* 拼接格式为歌手1、歌手2……的形式,方便在界面上展示歌曲的完整歌手信息。
|
|
|
|
|
* @param dataBean 包含歌曲相关信息的数据对象,从中获取歌手信息列表进行拼接处理
|
|
|
|
|
* @return 返回拼接好的歌手信息字符串
|
|
|
|
|
*/
|
|
|
|
|
//获取歌手,因为歌手可能有很多个
|
|
|
|
|
private String getSinger( SearchSong.DataBean.SongBean.ListBean dataBean){
|
|
|
|
|
private String getSinger(SearchSong.DataBean.SongBean.ListBean dataBean) {
|
|
|
|
|
StringBuilder singer = new StringBuilder(dataBean.getSinger().get(0).getName());
|
|
|
|
|
for (int i = 1; i < dataBean.getSinger().size(); i++) {
|
|
|
|
|
singer.append("、").append(dataBean.getSinger().get(i).getName());
|
|
|
|
|
}
|
|
|
|
|
return singer.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|