diff --git a/app/src/main/java/com/example/musicplayer/view/search/SearchContentFragment.java b/app/src/main/java/com/example/musicplayer/view/search/SearchContentFragment.java index 7970419..b4969ec 100644 --- a/app/src/main/java/com/example/musicplayer/view/search/SearchContentFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/search/SearchContentFragment.java @@ -45,48 +45,81 @@ import butterknife.BindView; /** * Created by 残渊 on 2018/11/21. + * 这个类表示搜索内容展示的Fragment,用于展示搜索歌曲或专辑的结果, + * 具备加载数据、处理下拉刷新和上拉加载更多、与播放服务交互以及响应相关事件等功能, + * 遵循MVP模式,实现了ISearchContentContract.View接口定义的视图相关操作规范, + * 同时继承自BaseLoadingFragment,可能具备一些基础的加载相关的功能和属性。 */ - public class SearchContentFragment extends BaseLoadingFragment 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 mSongList = new ArrayList<>(); + // 存储搜索到的专辑列表数据的集合,初始化为null,后续根据搜索结果赋值并用于展示相关专辑信息 private List 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 songListBeans) { mSongList.addAll(songListBeans); @@ -160,23 +235,28 @@ public class SearchContentFragment extends BaseLoadingFragment { 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 songListBeans) { mSongList.addAll(songListBeans); @@ -184,11 +264,20 @@ public class SearchContentFragment extends BaseLoadingFragment { @@ -217,17 +310,12 @@ public class SearchContentFragment extends BaseLoadingFragment 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 songListBeans) { mAlbumList.addAll(songListBeans); @@ -235,23 +323,34 @@ public class SearchContentFragment extends BaseLoadingFragment