diff --git a/app/src/androidTest/java/com/example/musicplayer/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/musicplayer/ExampleInstrumentedTest.java index f789981..992d18d 100644 --- a/app/src/androidTest/java/com/example/musicplayer/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/example/musicplayer/ExampleInstrumentedTest.java @@ -7,20 +7,28 @@ import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; - /** - * Instrumented test, which will execute on an Android device. - * + * ExampleInstrumentedTest 是一个继承自 AndroidJUnit4 的测试类,用于在Android设备上执行测试。 + *

+ * 这个类包含了一个测试方法 useAppContext,用于验证应用程序的上下文是否正确。 + *

* @see Testing documentation + * 注意:上面的链接是指向Android官方文档中关于测试的文档,如果无法访问,可能是因为网络问题或者链接不正确。 */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { + /** + * useAppContext 是一个测试方法,用于验证应用程序的上下文。 + * 这个方法会检查测试的应用程序的包名是否与预期的包名相匹配。 + * @throws Exception 如果测试失败,则抛出异常。 + */ @Test public void useAppContext() throws Exception { - // Context of the app under test. + // 获取当前测试的应用程序的上下文环境 Context appContext = InstrumentationRegistry.getTargetContext(); + // 断言测试的应用程序的包名是否为 "com.example.musicplayer" + // 如果包名不匹配,则测试失败,并抛出异常 assertEquals("com.example.musicplayer", appContext.getPackageName()); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java index 392686d..b59c49d 100644 --- a/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java +++ b/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java @@ -17,34 +17,53 @@ import com.example.musicplayer.util.FileUtil; import java.util.List; /** - * Created by 残渊 on 2018/11/27. + * AlbumSongAdapter 是一个 RecyclerView.Adapter 的扩展,用于展示专辑中的歌曲列表。 */ - public class AlbumSongAdapter extends RecyclerView.Adapter { + // 歌曲数据列表 private List mSongsBeanList; + // 上一个被点击的位置 private int mLastPosition = -1; + // 点击事件的监听器 private OnItemClickListener mSongClick; + // 歌曲项的视图类型 private final int songType = 1; + // 底部视图的类型 private final int footerType = 2; + /** + * 构造函数,初始化歌曲列表。 + * @param songsBeans 歌曲数据的列表 + */ public AlbumSongAdapter(List songsBeans) { mSongsBeanList = songsBeans; } + /** + * 设置歌曲点击事件的监听器。 + * @param songClick 点击事件监听器 + */ public void setSongClick(OnItemClickListener songClick) { mSongClick = songClick; } + /** + * 创建新的ViewHolder实例。 + * @param parent 父布局 + * @param viewType 视图类型 + * @return 返回对应的ViewHolder + */ @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + // 根据视图类型创建不同的ViewHolder if (viewType == songType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycler_song_search_item, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; - }else{ + } else { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.footer_view_player_height, parent, false); FooterHolder footerHolder = new FooterHolder(view); @@ -52,12 +71,18 @@ public class AlbumSongAdapter extends RecyclerView.Adapter { mSongClick.onClick(position); equalPosition(position); @@ -83,18 +109,29 @@ public class AlbumSongAdapter extends RecyclerView.Adapter * author : 残渊 * time : 2019/09/18 @@ -25,30 +26,52 @@ import java.util.List; */ public class DownloadSongAdapter extends RecyclerView.Adapter { + // 用于日志记录的标签 private static final String TAG = "LoveSongAdapter"; + // 底部视图类型 private int footerViewType = 1; + // 歌曲项视图类型 private int itemViewType = 0; + // 已下载歌曲的数据列表 private List mDownloadSongList; + // 上下文环境 private Context mContext; + // 上一个被点击的位置 private int mLastPosition = -1; + // 点击事件的监听器 private OnItemClickListener onItemClickListener; + /** + * 设置点击事件的监听器。 + * @param onItemClickListener 点击事件监听器 + */ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } + /** + * 构造函数,初始化上下文环境和已下载歌曲的数据列表。 + * @param context 上下文环境 + * @param loveList 已下载歌曲的数据列表 + */ public DownloadSongAdapter(Context context, List loveList) { mContext = context; mDownloadSongList = loveList; } - + /** + * ViewHolder类,用于歌曲列表项。 + */ class ViewHolder extends RecyclerView.ViewHolder { TextView songNameTv; TextView singerTv; View playLine; RippleView item; + /** + * 构造函数,初始化歌曲列表项的视图。 + * @param itemView 歌曲列表项的视图 + */ public ViewHolder(View itemView) { super(itemView); songNameTv = itemView.findViewById(R.id.tv_title); @@ -59,21 +82,31 @@ public class DownloadSongAdapter extends RecyclerView.Adapter * author : 残渊 * time : 2019/09/17 @@ -28,25 +29,40 @@ import java.util.List; */ public class DownloadingAdapter extends RecyclerView.Adapter { - - + // 正在下载的歌曲信息列表 private List downloadInfoList; - + // 项点击事件监听器 private OnItemClickListener onItemClickListener; + // 删除点击事件监听器 private OnDeleteClickListener onDeleteClickListener; + /** + * 设置删除点击事件的监听器。 + * @param onDeleteClickListener 删除事件监听器 + */ public void setOnDeleteClickListener(OnDeleteClickListener onDeleteClickListener){ this.onDeleteClickListener = onDeleteClickListener; } + /** + * 设置项点击事件的监听器。 + * @param onItemClickListener 项点击事件监听器 + */ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } + /** + * 构造函数,初始化正在下载的歌曲信息列表。 + * @param downloadInfoList 正在下载的歌曲信息列表 + */ public DownloadingAdapter(List downloadInfoList) { this.downloadInfoList = downloadInfoList; } + /** + * ViewHolder类,用于下载列表项。 + */ class ViewHolder extends RecyclerView.ViewHolder { TextView songTv; TextView sizeTv; @@ -54,6 +70,10 @@ public class DownloadingAdapter extends RecyclerView.Adapter true); //消费该事件,让seekBar不能拖动和点击 holder.seekBar.setProgress(downloadInfo.getProgress()); - //点击事件 + // 设置点击事件 holder.itemView.setOnClickListener(view -> { - onItemClickListener.onClick(i); + onItemClickListener.onClick(position); }); - //取消 - holder.cancelTv.setOnClickListener(view -> onDeleteClickListener.onClick(i)); - - + // 设置取消按钮点击事件 + holder.cancelTv.setOnClickListener(view -> onDeleteClickListener.onClick(position)); } + /** + * 返回总的条目数。 + * @return 总条目数 + */ @Override public int getItemCount() { return downloadInfoList.size(); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/example/musicplayer/adapter/ExpandableListViewAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/ExpandableListViewAdapter.java index 8dd9c00..47ce675 100644 --- a/app/src/main/java/com/example/musicplayer/adapter/ExpandableListViewAdapter.java +++ b/app/src/main/java/com/example/musicplayer/adapter/ExpandableListViewAdapter.java @@ -17,64 +17,80 @@ import com.example.musicplayer.util.CommonUtil; import java.util.List; /** - * 自建歌单和收藏歌单的二级适配类 + * 自建歌单和收藏歌单的二级适配类。 * Created by 残渊 on 2018/9/23. */ public class ExpandableListViewAdapter extends BaseExpandableListAdapter { private static final String TAG = "ExpandableListViewAdapter"; - private String[] mGroupStrings; //一级标题 - private List> mAlbumCollectionList; //二级收藏歌单列表 - private Context mContext; - private OnChildItemClickListener mChildClickListener; //二级item的点击监听 - - + private String[] mGroupStrings; // 一级标题数组 + private List> mAlbumCollectionList; // 二级歌单列表 + private Context mContext; // 上下文环境 + private OnChildItemClickListener mChildClickListener; // 二级项的点击监听器 + + /** + * 构造函数,初始化适配器。 + * @param context 上下文环境 + * @param groupStrings 一级标题数组 + * @param albumCollectionList 二级歌单列表 + */ public ExpandableListViewAdapter(Context context, String[] groupStrings, List> albumCollectionList) { mAlbumCollectionList = albumCollectionList; mGroupStrings = groupStrings; mContext = context; } - //提供给外部使用 - public void setOnChildItemClickListener(OnChildItemClickListener onChildItemClickListener){ - mChildClickListener=onChildItemClickListener; + + /** + * 设置二级项的点击监听器。 + * @param onChildItemClickListener 点击监听器 + */ + public void setOnChildItemClickListener(OnChildItemClickListener onChildItemClickListener){ + mChildClickListener = onChildItemClickListener; } + // 获取一级列表的组数 @Override public int getGroupCount() { return mGroupStrings.length; } + // 获取指定组的子项数 @Override public int getChildrenCount(int groupPosition) { return mAlbumCollectionList.get(groupPosition).size(); } + // 获取指定组的对象 @Override public Object getGroup(int groupPosition) { return mGroupStrings[groupPosition]; } + // 获取指定子项的对象 @Override public Object getChild(int groupPosition, int childPosition) { return mAlbumCollectionList.get(groupPosition).get(childPosition); } + // 获取指定组的ID @Override public long getGroupId(int groupPosition) { return groupPosition; } + // 获取指定子项的ID @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } + // 是否有稳定的ID @Override public boolean hasStableIds() { return true; } - //绘制一级列表 + // 绘制一级列表项 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View view; @@ -90,7 +106,7 @@ public class ExpandableListViewAdapter extends BaseExpandableListAdapter { groupViewHolder = (GroupViewHolder) view.getTag(); } groupViewHolder.groupTextView.setText(mGroupStrings[groupPosition]); - //根据展开的状态来改变箭头方向 + // 根据展开状态改变箭头方向 if (isExpanded) { groupViewHolder.pointIv.setImageResource(R.drawable.up); } else { @@ -99,8 +115,7 @@ public class ExpandableListViewAdapter extends BaseExpandableListAdapter { return view; } - - //绘制二级列表 + // 绘制二级列表项 @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View view; @@ -122,26 +137,28 @@ public class ExpandableListViewAdapter extends BaseExpandableListAdapter { childViewHolder.authorTv.setText(mAlbumCollectionList.get(groupPosition).get(childPosition).getSingerName()); CommonUtil.setImgWithGlide(mContext, mAlbumCollectionList.get(groupPosition).get(childPosition).getAlbumPic(), childViewHolder.faceIv); - //点击水波纹效果,结束后开始点击效果 - childViewHolder.childView.setOnRippleCompleteListener(rippleView -> mChildClickListener.onClick(groupPosition,childPosition)); + // 点击水波纹效果,结束后开始点击效果 + childViewHolder.childView.setOnRippleCompleteListener(rippleView -> mChildClickListener.onClick(groupPosition, childPosition)); return view; } + // 是否可以选择子项 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } - + // 一级列表项的ViewHolder class GroupViewHolder { private TextView groupTextView; private ImageView pointIv; } + // 二级列表项的ViewHolder class ChildViewHolder { TextView albumNameTv; ImageView faceIv; TextView authorTv; RippleView childView; } -} +} \ No newline at end of file