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 { private static final String TAG = "SearchContentAdapter"; private ArrayList mSongListBeans; // 单曲列表数据 private List 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 dataBeans, String seek, Context context, int type) { mContext = context; mSeek = seek; mAlbumList = dataBeans; mType = type; } // 构造函数,初始化单曲搜索适配器 public SearchContentAdapter(ArrayList 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); } }