You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
test-music/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java

199 lines
8.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.example.musicplayer.adapter;
// 导入所需的包和类
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.andexert.library.RippleView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.example.musicplayer.R;
import com.example.musicplayer.callback.OnAlbumItemClickListener;
import com.example.musicplayer.callback.OnItemClickListener;
import com.example.musicplayer.app.Constant;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.SearchSong;
import com.example.musicplayer.util.CommonUtil;
import com.example.musicplayer.util.FileUtil;
import java.util.ArrayList;
import java.util.List;
/**
* 搜索内容适配器,用于展示搜索结果中的单曲和专辑列表。
* Created by 残渊 on 2018/11/21.
*/
public class SearchContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = "SearchContentAdapter";
private ArrayList<SearchSong.DataBean.SongBean.ListBean> mSongListBeans; // 单曲列表数据
private List<Album.DataBean.AlbumBean.ListBean> mAlbumList; // 专辑列表数据
private static OnItemClickListener mItemClick; // 单曲点击事件监听器
private static OnAlbumItemClickListener mAlbumClick; // 专辑点击事件监听器
private String mSeek; // 搜索关键字
private Context mContext; // 上下文对象
private int mLastPosition = -1; // 上一次点击的位置
private int mType; // 列表类型,单曲或专辑
// 设置单曲点击事件监听器
public static void setItemClick(OnItemClickListener itemClick) {
mItemClick = itemClick;
}
// 设置专辑点击事件监听器
public static void setAlbumClick(OnAlbumItemClickListener albumClick) {
mAlbumClick = albumClick;
}
// 构造函数,初始化专辑搜索适配器
public SearchContentAdapter(List<Album.DataBean.AlbumBean.ListBean> dataBeans, String seek, Context context, int type) {
mContext = context;
mSeek = seek;
mAlbumList = dataBeans;
mType = type;
}
// 构造函数,初始化单曲搜索适配器
public SearchContentAdapter(ArrayList<SearchSong.DataBean.SongBean.ListBean> songListBeans, String seek, Context context, int type) {
mContext = context;
mSeek = seek;
mSongListBeans = songListBeans;
mType = type;
}
// 创建ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
final View view;
if (viewType == Constant.TYPE_SONG) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_song_search_item, parent, false);
return new ViewHolder(view);
} else if (viewType == Constant.TYPE_ALBUM) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_album_item, parent, false);
return new AlbumHolder(view);
}
return null;
}
// 将数据绑定到ViewHolder
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
// 根据ViewHolder类型进行不同的数据处理
if (holder instanceof ViewHolder) {
ViewHolder songHolder = (ViewHolder) holder;
SearchSong.DataBean.SongBean.ListBean songListBean = mSongListBeans.get(position);
// 设置歌手名称,可能存在多个歌手
String singer = songListBean.getSinger().get(0).getName();
for (int i = 1; i < songListBean.getSinger().size(); i++) {
singer += "、" + songListBean.getSinger().get(i).getName();
}
songHolder.artistTv.setText(singer);
// 高亮显示搜索关键字
CommonUtil.showStringColor(mSeek, singer, songHolder.artistTv);
songHolder.titleTv.setText(songListBean.getSongname());
CommonUtil.showStringColor(mSeek, songListBean.getSongname(), songHolder.titleTv);
// 根据歌曲是否正在播放显示不同的样式
if (songListBean.getSongmid().equals(FileUtil.getSong().getSongId())) {
songHolder.playLine.setVisibility(View.VISIBLE);
mLastPosition = position;
songHolder.mItemView.setBackgroundResource(R.color.translucent);
} else {
songHolder.playLine.setVisibility(View.INVISIBLE);
songHolder.mItemView.setBackgroundResource(R.color.transparent);
}
// 设置点击事件
songHolder.mItemView.setOnRippleCompleteListener(rippleView -> {
mItemClick.onClick(position);
equalPosition(position);
});
} else {
AlbumHolder albumHolder = (AlbumHolder) holder;
Album.DataBean.AlbumBean.ListBean albumList = mAlbumList.get(position);
// 使用Glide加载专辑图片
Glide.with(mContext).load(albumList.getAlbumPic())
.apply(RequestOptions.errorOf(R.drawable.background)).into(albumHolder.albumIv);
albumHolder.albumName.setText(albumList.getAlbumName());
albumHolder.singerName.setText(albumList.getSingerName());
albumHolder.publicTime.setText(albumList.getPublicTime());
// 高亮显示搜索关键字
CommonUtil.showStringColor(mSeek, albumList.getAlbumName(), albumHolder.albumName);
CommonUtil.showStringColor(mSeek, albumList.getSingerName(), albumHolder.singerName);
CommonUtil.showStringColor(mSeek, albumList.getPublicTime(), albumHolder.publicTime);
// 设置点击事件
albumHolder.item.setOnRippleCompleteListener(rippleView -> {
mAlbumClick.onClick(position);
});
}
}
// 获取列表项的总数
@Override
public int getItemCount() {
if (mType == Constant.TYPE_SONG) {
return mSongListBeans.size();
} else if (mType == Constant.TYPE_ALBUM) {
return mAlbumList.size();
}
return 0;
}
// 内部类ViewHolder用于单曲列表项
class ViewHolder extends RecyclerView.ViewHolder {
TextView titleTv;
TextView artistTv;
RippleView mItemView;
View playLine;
public ViewHolder(View itemView) {
super(itemView);
titleTv = itemView.findViewById(R.id.tv_title);
artistTv = itemView.findViewById(R.id.tv_artist);
playLine = itemView.findViewById(R.id.line_play);
mItemView = itemView.findViewById(R.id.ripple);
}
}
// 内部类AlbumHolder用于专辑列表项
class AlbumHolder extends RecyclerView.ViewHolder {
ImageView albumIv;
TextView singerName;
TextView albumName;
TextView publicTime;
RippleView item;
public AlbumHolder(View itemView) {
super(itemView);
albumIv = itemView.findViewById(R.id.iv_album);
singerName = itemView.findViewById(R.id.tv_singer_name);
albumName = itemView.findViewById(R.id.tv_album_name);
publicTime = itemView.findViewById(R.id.tv_public_time);
item = itemView.findViewById(R.id.ripple);
}
}
// 获取列表项的视图类型
@Override
public int getItemViewType(int position) {
return mType;
}
// 判断点击的是否为上一个点击的项目,并更新视图
public void equalPosition(int position) {
if (position != mLastPosition) {
if (mLastPosition != -1) notifyItemChanged(mLastPosition);
mLastPosition = position;
}
notifyItemChanged(position);
}
}