增加专辑列表功能

pull/1/head
jsyjst 7 years ago
parent 14f2afa624
commit ae0f6b4bf7

@ -47,7 +47,13 @@ dependencies {
implementation 'com.google.code.gson:gson:2.8.2' implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
//glide //glide
implementation 'com.github.bumptech.glide:glide:4.8.0' implementation 'com.github.bumptech.glide:glide:4.0.0'
//LRecyclerView //LRecyclerView
implementation 'com.github.jdsjlzx:LRecyclerView:1.5.4.3' implementation 'com.github.jdsjlzx:LRecyclerView:1.5.4.3'
//CardView
implementation 'com.android.support:cardview-v7:27.1.1'
//page
implementation 'com.github.florent37:materialviewpager:1.2.3'
implementation 'com.flaviofaria:kenburnsview:1.0.7'
implementation 'com.jpardogo.materialtabstrip:library:1.1.0'
} }

@ -0,0 +1,96 @@
package com.example.musicplayer.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.musicplayer.R;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.util.FileHelper;
import java.util.List;
/**
* Created by on 2018/11/27.
*/
public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.ViewHolder> {
private List<AlbumSong.DataBean.SongsBean> mSongsBeanList;
private int mLastPosition = -1;
private SongClick mSongClick;
public AlbumSongAdapter(List<AlbumSong.DataBean.SongsBean> songsBeans){
mSongsBeanList =songsBeans;
}
public void setSongClick(SongClick songClick){
mSongClick =songClick;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_song_search_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
AlbumSong.DataBean.SongsBean songsBean=mSongsBeanList.get(position);
holder.artistTv.setText(songsBean.getSinger());
holder.titleTv.setText(songsBean.getName());
if (FileHelper.getSong().getImgUrl() != null) {
//根据点击显示
holder.playLine.setVisibility((position == mLastPosition ? View.VISIBLE : View.INVISIBLE));
holder.mItemView.setBackgroundResource((position == mLastPosition ? R.color.click : R.color.translucent));
}
holder.mItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSongClick.onClick(position);
equalPosition(position);
}
});
}
@Override
public int getItemCount() {
return mSongsBeanList.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
TextView titleTv;
TextView artistTv;
View 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;
}
}
//判断点击的是否为上一个点击的项目
private void equalPosition(int position) {
if (position != mLastPosition) {
if (mLastPosition != -1) notifyItemChanged(mLastPosition);
mLastPosition = position;
}
notifyItemChanged(position);
}
public interface SongClick {
void onClick(int position);
}
}

@ -0,0 +1,39 @@
package com.example.musicplayer.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.example.musicplayer.view.SearchContentFragment;
import java.util.List;
/**
* Created by on 2018/11/25.
*/
public class SearchAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragmentList;//顶部导航栏的内容即fragment
private List<String> mTitle;//顶部导航栏的标题
public SearchAdapter(FragmentManager fragmentManager, List<Fragment>fragments, List<String>title){
super(fragmentManager);
mFragmentList=fragments;
mTitle=title;
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitle.get(position);
}
}

@ -7,83 +7,139 @@ import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.example.musicplayer.R; import com.example.musicplayer.R;
import com.example.musicplayer.constant.Constant;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.SeachSong;
import com.example.musicplayer.util.CommonUtil; import com.example.musicplayer.util.CommonUtil;
import com.example.musicplayer.util.FileHelper; import com.example.musicplayer.util.FileHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
/** /**
* Created by on 2018/11/21. * Created by on 2018/11/21.
*/ */
public class SearchContentAdapter extends RecyclerView.Adapter<SearchContentAdapter.ViewHolder> { public class SearchContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG="SearchContentAdapter"; private static final String TAG = "SearchContentAdapter";
private ArrayList<SeachSong.DataBean> mSongListBeans; private ArrayList<SeachSong.DataBean> mSongListBeans;
private List<Album.DataBean> mAlbumList;
private static ItemClick mItemClick; private static ItemClick mItemClick;
private static AlbumClick mAlbumClick;
private String mSeek; private String mSeek;
private Context mContext; private Context mContext;
private int mLastPosition = -1; private int mLastPosition = -1;
private int mType;
public static void setItemClick(ItemClick itemClick){ public static void setItemClick(ItemClick itemClick) {
mItemClick = itemClick; mItemClick = itemClick;
} }
public SearchContentAdapter(ArrayList<SeachSong.DataBean> songListBeans, String seek, Context context){ public static void setAlbumClick(AlbumClick albumClick) {
mAlbumClick = albumClick;
}
public SearchContentAdapter(List<Album.DataBean> dataBeans, String seek, Context context, int type) {
mContext = context;
mSeek = seek;
mAlbumList = dataBeans;
mType = type;
}
public SearchContentAdapter(ArrayList<SeachSong.DataBean> songListBeans, String seek, Context context, int type) {
mContext = context; mContext = context;
mSeek = seek; mSeek = seek;
mSongListBeans = songListBeans; mSongListBeans = songListBeans;
mType = type;
} }
@NonNull @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()) final View view;
.inflate(R.layout.recycler_song_search_item,parent,false); if (viewType == Constant.TYPE_SONG ) {
ViewHolder viewHolder = new ViewHolder(view); view = LayoutInflater.from(parent.getContext())
return viewHolder; .inflate(R.layout.recycler_song_search_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
} else if (viewType == Constant.TYPE_ALBUM) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_album_item, parent, false);
AlbumHolder albumHolder = new AlbumHolder(view);
return albumHolder;
}
return null;
} }
@Override @Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
SeachSong.DataBean songListBean = mSongListBeans.get(position); if (holder instanceof ViewHolder) {
holder.artistTv.setText(songListBean.getSinger()); ViewHolder songHolder = (ViewHolder) holder;
//设置与搜索一样的string的颜色 SeachSong.DataBean songListBean = mSongListBeans.get(position);
CommonUtil.showStringColor(mSeek,songListBean.getSinger(),holder.artistTv); songHolder.artistTv.setText(songListBean.getSinger());
holder.titleTv.setText(songListBean.getName()); //设置与搜索一样的string的颜色
CommonUtil.showStringColor(mSeek,songListBean.getName(),holder.titleTv); CommonUtil.showStringColor(mSeek, songListBean.getSinger(), songHolder.artistTv);
songHolder.titleTv.setText(songListBean.getName());
if(FileHelper.getSong().getImgUrl() !=null){ CommonUtil.showStringColor(mSeek, songListBean.getName(), songHolder.titleTv);
//根据点击显示
holder.playLine.setVisibility((position == mLastPosition|| if (FileHelper.getSong().getImgUrl() != null) {
(songListBean.getName().equals(FileHelper.getSong().getTitle())&& //根据点击显示
songListBean.getSinger().equals(FileHelper.getSong().getArtist()))) songHolder.playLine.setVisibility((position == mLastPosition ? View.VISIBLE : View.INVISIBLE));
?View.VISIBLE:View.INVISIBLE); songHolder.mItemView.setBackgroundResource((position == mLastPosition ? R.color.click : R.color.translucent));
holder.mItemView.setBackgroundResource((position == mLastPosition||
(songListBean.getName().equals(FileHelper.getSong().getTitle())&&
songListBean.getSinger().equals(FileHelper.getSong().getArtist())))
?R.color.click:R.color.translucent);
}
holder.mItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mItemClick.onClick(position);
equalPosition(position);
} }
}); songHolder.mItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: song");
mItemClick.onClick(position);
equalPosition(position);
}
});
} else {
AlbumHolder albumHolder = (AlbumHolder) holder;
Album.DataBean albumList = mAlbumList.get(position);
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.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: album");
mAlbumClick.onClick(position);
}
});
}
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return mSongListBeans.size(); if (mType == Constant.TYPE_SONG) {
return mSongListBeans.size();
} else if (mType == Constant.TYPE_ALBUM) {
return mAlbumList.size();
}
return 0;
} }
class ViewHolder extends RecyclerView.ViewHolder{ class ViewHolder extends RecyclerView.ViewHolder {
TextView titleTv; TextView titleTv;
TextView artistTv; TextView artistTv;
View mItemView; View mItemView;
@ -98,14 +154,40 @@ public class SearchContentAdapter extends RecyclerView.Adapter<SearchContentAdap
} }
} }
public interface ItemClick{ class AlbumHolder extends RecyclerView.ViewHolder {
ImageView albumIv;
TextView singerName;
TextView albumName;
TextView publicTime;
View 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;
}
}
@Override
public int getItemViewType(int position) {
return mType;
}
public interface ItemClick {
void onClick(int position);
}
public interface AlbumClick {
void onClick(int position); void onClick(int position);
} }
//判断点击的是否为上一个点击的项目 //判断点击的是否为上一个点击的项目
public void equalPosition(int position) { private void equalPosition(int position) {
if (position != mLastPosition) { if (position != mLastPosition) {
if(mLastPosition!=-1) notifyItemChanged(mLastPosition); if (mLastPosition != -1) notifyItemChanged(mLastPosition);
mLastPosition = position; mLastPosition = position;
} }
notifyItemChanged(position); notifyItemChanged(position);

@ -133,10 +133,6 @@ public class SongAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
onItemClickListener.onSongClick(); onItemClickListener.onSongClick();
equalPosition(position); equalPosition(position);
} }
}); });
}else{ }else{

@ -6,4 +6,7 @@ package com.example.musicplayer.constant;
public class Constant { public class Constant {
public static final int OFFSET=30; public static final int OFFSET=30;
public static final int TYPE_SONG=1;
public static final int TYPE_ALBUM=2;
public static final int TYPE_ALBUM_SONG=3;
} }

@ -0,0 +1,29 @@
package com.example.musicplayer.contract;
import com.example.musicplayer.entiy.AlbumSong;
import java.util.List;
/**
* Created by on 2018/11/27.
*/
public interface IAlbumSongContract {
interface Model{
void getAlbumDetail(String id,int type); //获取专辑的更多信息
}
interface View{
void setAlbumSongList(List<AlbumSong.DataBean.SongsBean> songList); //成功获取专辑歌曲后填充列表
void showAlbumSongError();//获取专辑失败
void showAlbumMessage(String name,String singer,String company,String desc); //展示专辑详细
void showNetError(); //网络错误
}
interface Presenter{
void getAlbumDetail(String id,int type); //获取专辑的更多信息
void getAlbumDetailSuccess(int type,List<AlbumSong.DataBean.SongsBean>songList,
String name,String singer,String company,String desc); //成功获取专辑信息
void getAlbumDetailError(); //获取专辑信息失败
void getAlbumError(); //接口出现问题
}
}

@ -1,8 +1,10 @@
package com.example.musicplayer.contract; package com.example.musicplayer.contract;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.SeachSong;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
/** /**
* Created by on 2018/11/21. * Created by on 2018/11/21.
@ -12,16 +14,23 @@ public interface ISearchContentContract {
interface Model{ interface Model{
void search(String seek,int offset); //搜索 void search(String seek,int offset); //搜索
void searchMore(String seek,int offset); //搜索更多 void searchMore(String seek,int offset); //搜索更多
void searchAlbum(String seek,int offset); //搜索专辑
void searchAlbumMore(String seek,int offset);//搜索更多专辑
} }
interface View{ interface View{
String getSeekContent(); //获得搜索的内容
void setSongsList(ArrayList<SeachSong.DataBean> songListBeans); //显示歌曲列表 void setSongsList(ArrayList<SeachSong.DataBean> songListBeans); //显示歌曲列表
void searchMoreSuccess(ArrayList<SeachSong.DataBean> songListBeans); //搜索更多内容成功 void searchMoreSuccess(ArrayList<SeachSong.DataBean> songListBeans); //搜索更多内容成功
void searchMoreError(); //搜索更多内容失败 void searchMoreError(); //搜索更多内容失败
void searchMore();//搜索更多 void searchMore();//搜索更多
void showError(); void showError();
void showSearcherMoreNetworkError();//下拉刷新网络错误 void showSearcherMoreNetworkError();//下拉刷新网络错误
void searchAlbumSuccess(List<Album.DataBean> albumList); //获取专辑成功
void searchAlbumMoreSuccess(List<Album.DataBean> songListBeans); //搜索更多内容成功
void searchAlbumError(); //获取专辑失败
} }
interface Presenter{ interface Presenter{
void search(String seek,int offset); //搜索 void search(String seek,int offset); //搜索
@ -31,5 +40,12 @@ public interface ISearchContentContract {
void searchMoreSuccess(ArrayList<SeachSong.DataBean> songListBeans); //搜索更多内容成功 void searchMoreSuccess(ArrayList<SeachSong.DataBean> songListBeans); //搜索更多内容成功
void searchMoreError(); //搜索更多内容失败 void searchMoreError(); //搜索更多内容失败
void showSearchMoreNetworkError();//下拉刷新网络错误 void showSearchMoreNetworkError();//下拉刷新网络错误
void searchAlbum(String seek,int offset); //搜索专辑
void searchAlbumSuccess(List<Album.DataBean> albumList); //获取专辑成功
void searchAlbumError(); //获取专辑失败
void searchAlbumMore(String seek,int offset);//搜索更多专辑
void searchAlbumMoreSuccess(List<Album.DataBean> songListBeans); //搜索更多内容成功
} }
} }

@ -0,0 +1,246 @@
package com.example.musicplayer.entiy;
import java.util.List;
/**
* Created by on 2018/11/25.
*/
public class Album {
/**
* result : SUCCESS
* code : 200
* data : [{"albumID":8217,"albumMID":"000I5jJB3blWeN","albumName":"范特西","albumName_hilight":"范特西","albumPic":"http://y.gtimg.cn/music/photo_new/T002R180x180M000000I5jJB3blWeN.jpg","catch_song":"","docid":"9955806126048031202","publicTime":"2001-09-20","singerID":4558,"singerMID":"0025NhlN2yWrP4","singerName":"周杰伦","singerName_hilight":"<em>周杰伦<\/em>","singer_list":[{"id":4558,"mid":"0025NhlN2yWrP4","name":"周杰伦","name_hilight":"<em>周杰伦<\/em>"}],"song_count":10,"type":0}]
*/
private String result;
private int code;
private List<DataBean> data;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* albumID : 8217
* albumMID : 000I5jJB3blWeN
* albumName : 西
* albumName_hilight : 西
* albumPic : http://y.gtimg.cn/music/photo_new/T002R180x180M000000I5jJB3blWeN.jpg
* catch_song :
* docid : 9955806126048031202
* publicTime : 2001-09-20
* singerID : 4558
* singerMID : 0025NhlN2yWrP4
* singerName :
* singerName_hilight : <em></em>
* singer_list : [{"id":4558,"mid":"0025NhlN2yWrP4","name":"周杰伦","name_hilight":"<em>周杰伦<\/em>"}]
* song_count : 10
* type : 0
*/
private int albumID;
private String albumMID;
private String albumName;
private String albumName_hilight;
private String albumPic;
private String catch_song;
private String docid;
private String publicTime;
private int singerID;
private String singerMID;
private String singerName;
private String singerName_hilight;
private int song_count;
private int type;
private List<SingerListBean> singer_list;
public int getAlbumID() {
return albumID;
}
public void setAlbumID(int albumID) {
this.albumID = albumID;
}
public String getAlbumMID() {
return albumMID;
}
public void setAlbumMID(String albumMID) {
this.albumMID = albumMID;
}
public String getAlbumName() {
return albumName;
}
public void setAlbumName(String albumName) {
this.albumName = albumName;
}
public String getAlbumName_hilight() {
return albumName_hilight;
}
public void setAlbumName_hilight(String albumName_hilight) {
this.albumName_hilight = albumName_hilight;
}
public String getAlbumPic() {
return albumPic;
}
public void setAlbumPic(String albumPic) {
this.albumPic = albumPic;
}
public String getCatch_song() {
return catch_song;
}
public void setCatch_song(String catch_song) {
this.catch_song = catch_song;
}
public String getDocid() {
return docid;
}
public void setDocid(String docid) {
this.docid = docid;
}
public String getPublicTime() {
return publicTime;
}
public void setPublicTime(String publicTime) {
this.publicTime = publicTime;
}
public int getSingerID() {
return singerID;
}
public void setSingerID(int singerID) {
this.singerID = singerID;
}
public String getSingerMID() {
return singerMID;
}
public void setSingerMID(String singerMID) {
this.singerMID = singerMID;
}
public String getSingerName() {
return singerName;
}
public void setSingerName(String singerName) {
this.singerName = singerName;
}
public String getSingerName_hilight() {
return singerName_hilight;
}
public void setSingerName_hilight(String singerName_hilight) {
this.singerName_hilight = singerName_hilight;
}
public int getSong_count() {
return song_count;
}
public void setSong_count(int song_count) {
this.song_count = song_count;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public List<SingerListBean> getSinger_list() {
return singer_list;
}
public void setSinger_list(List<SingerListBean> singer_list) {
this.singer_list = singer_list;
}
public static class SingerListBean {
/**
* id : 4558
* mid : 0025NhlN2yWrP4
* name :
* name_hilight : <em></em>
*/
private int id;
private String mid;
private String name;
private String name_hilight;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getName_hilight() {
return name_hilight;
}
public void setName_hilight(String name_hilight) {
this.name_hilight = name_hilight;
}
}
}
}

File diff suppressed because one or more lines are too long

@ -1,6 +1,8 @@
package com.example.musicplayer.https; package com.example.musicplayer.https;
import com.example.musicplayer.constant.BaseUri; import com.example.musicplayer.constant.BaseUri;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.https.api.AlbumApi;
import com.example.musicplayer.https.api.SearchApi; import com.example.musicplayer.https.api.SearchApi;
import com.example.musicplayer.https.api.SingerImgApi; import com.example.musicplayer.https.api.SingerImgApi;
@ -27,6 +29,7 @@ public class NetWork {
private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create(); private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create();
private static SingerImgApi singerImgApi; private static SingerImgApi singerImgApi;
private static SearchApi searchApi; private static SearchApi searchApi;
private static AlbumApi albumApi;
public static SingerImgApi getSingerImgApi(){ public static SingerImgApi getSingerImgApi(){
if(singerImgApi==null){ if(singerImgApi==null){
@ -53,5 +56,18 @@ public class NetWork {
} }
return searchApi; return searchApi;
} }
public static AlbumApi getAlbumApi(){
if(albumApi ==null){
Retrofit retrofit =new Retrofit.Builder()
.client(builder.build())
.baseUrl(QQ_URL)
.addCallAdapterFactory(rxJavaCallAdapterFactory)
.addConverterFactory(gsonConverterFactory)
.build();
albumApi = retrofit.create(AlbumApi.class);
}
return albumApi;
}
} }

@ -0,0 +1,16 @@
package com.example.musicplayer.https.api;
import com.example.musicplayer.entiy.AlbumSong;
import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
/**
* Created by on 2018/11/27.
*/
public interface AlbumApi {
@GET("album?key=579621905")
Observable<AlbumSong> getAlbumSong(@Query("id")String id);
}

@ -1,5 +1,6 @@
package com.example.musicplayer.https.api; package com.example.musicplayer.https.api;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.SeachSong;
import io.reactivex.Observable; import io.reactivex.Observable;
@ -17,4 +18,7 @@ import retrofit2.http.Query;
public interface SearchApi { public interface SearchApi {
@GET("search?key=579621905&type=song&limit=30") @GET("search?key=579621905&type=song&limit=30")
Observable<SeachSong> search(@Query("s") String seek,@Query("offset")int offset); Observable<SeachSong> search(@Query("s") String seek,@Query("offset")int offset);
@GET("search?key=579621905&type=album&limit=30")
Observable<Album> searchAlbum(@Query("s") String seek,@Query("offset")int offset);
} }

@ -0,0 +1,60 @@
package com.example.musicplayer.model;
import android.util.Log;
import com.example.musicplayer.contract.IAlbumSongContract;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.https.NetWork;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* Created by on 2018/11/27.
*/
public class AlbumSongModel implements IAlbumSongContract.Model {
private static final String TAG="AlbumSongModel";
private IAlbumSongContract.Presenter mPresenter;
public AlbumSongModel(IAlbumSongContract.Presenter presenter){
mPresenter = presenter;
}
@Override
public void getAlbumDetail(String id,final int type) {
NetWork.getAlbumApi().getAlbumSong(id)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<AlbumSong>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(AlbumSong value) {
if(value.getResult().equals("SUCCESS")){
mPresenter.getAlbumDetailSuccess(type,value.getData().getSongs(),
value.getData().getName(),value.getData().getSinger(),
value.getData().getCompany(),value.getData().getDesc());
}else{
mPresenter.getAlbumDetailError();
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: "+e.toString());
mPresenter.getAlbumError();
}
@Override
public void onComplete() {
}
});
}
}

@ -3,6 +3,7 @@ package com.example.musicplayer.model;
import android.util.Log; import android.util.Log;
import com.example.musicplayer.contract.ISearchContentContract; import com.example.musicplayer.contract.ISearchContentContract;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.SeachSong;
import com.example.musicplayer.https.NetWork; import com.example.musicplayer.https.NetWork;
@ -27,7 +28,7 @@ public class SearchContentModel implements ISearchContentContract.Model {
@Override @Override
public void search(String seek, int offset) { public void search(String seek, int offset) {
NetWork.getSearchApi().search(seek, offset) NetWork.getSearchApi().search(seek,offset)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<SeachSong>() { .subscribe(new Observer<SeachSong>() {
@Override @Override
@ -55,7 +56,7 @@ public class SearchContentModel implements ISearchContentContract.Model {
} }
@Override @Override
public void searchMore(String seek, int offset) { public void searchMore(String seek,int offset) {
NetWork.getSearchApi().search(seek, offset) NetWork.getSearchApi().search(seek, offset)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<SeachSong>() { .subscribe(new Observer<SeachSong>() {
@ -90,4 +91,74 @@ public class SearchContentModel implements ISearchContentContract.Model {
} }
}); });
} }
@Override
public void searchAlbum(String seek, int offset) {
NetWork.getSearchApi().searchAlbum(seek,offset)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Album>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Album value) {
if(value.getResult().equals("SUCCESS")){
mPresenter.searchAlbumSuccess(value.getData());
}else{
mPresenter.searchAlbumError();
}
}
@Override
public void onError(Throwable e) {
mPresenter.searchAlbumError();
Log.d(TAG, "onError: searchAlbumError" + e.toString());
}
@Override
public void onComplete() {
}
});
}
@Override
public void searchAlbumMore(String seek, int offset) {
NetWork.getSearchApi().searchAlbum(seek, offset)
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Album>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Album value) {
if (value.getResult().equals("SUCCESS")) {
Log.d(TAG, "onNext: success");
if (value.getData().size() == 0) {
mPresenter.searchMoreError();
} else {
mPresenter.searchAlbumMoreSuccess(value.getData());
}
} else {
mPresenter.searchMoreError();
}
}
@Override
public void onError(Throwable e) {
mPresenter.showSearchMoreNetworkError();
Log.d(TAG, "onError: " + e.toString());
}
@Override
public void onComplete() {
}
});
}
} }

@ -0,0 +1,58 @@
package com.example.musicplayer.presenter;
import android.util.Log;
import com.example.musicplayer.base.BasePresenter;
import com.example.musicplayer.contract.IAlbumSongContract;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.model.AlbumSongModel;
import com.example.musicplayer.view.AlbumSongFragment;
import java.util.List;
/**
* Created by on 2018/11/27.
*/
public class AlbumSongPresenter extends BasePresenter<IAlbumSongContract.View> implements IAlbumSongContract.Presenter {
private final static String TAG="AlbumSongPresenter";
private AlbumSongModel mModel;
public AlbumSongPresenter() {
mModel = new AlbumSongModel(this);
}
@Override
public void getAlbumDetail(String id,int type) {
mModel.getAlbumDetail(id,type);
}
@Override
public void getAlbumDetailSuccess(int type, List<AlbumSong.DataBean.SongsBean> songList,
String name, String singer, String company, String desc) {
if (isAttachView()) {
if (type == AlbumSongFragment.ALBUM_SONG) {
getMvpView().setAlbumSongList(songList);
Log.d(TAG, "getAlbumDetailSuccess: "+songList.size());
} else {
getMvpView().showAlbumMessage(name, singer, company, desc);
}
}
}
@Override
public void getAlbumDetailError() {
if (isAttachView()) {
getMvpView().showAlbumSongError();
}
}
@Override
public void getAlbumError() {
if (isAttachView()) {
getMvpView().showNetError();
}
}
}

@ -2,10 +2,12 @@ package com.example.musicplayer.presenter;
import com.example.musicplayer.base.BasePresenter; import com.example.musicplayer.base.BasePresenter;
import com.example.musicplayer.contract.ISearchContentContract; import com.example.musicplayer.contract.ISearchContentContract;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.SeachSong;
import com.example.musicplayer.model.SearchContentModel; import com.example.musicplayer.model.SearchContentModel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler; import java.util.logging.Handler;
/** /**
@ -27,7 +29,7 @@ public class SearchContentPresenter extends BasePresenter<ISearchContentContract
} }
@Override @Override
public void searchMore(String seek, int offset) { public void searchMore(String seek,int offset) {
mModel.searchMore(seek,offset); mModel.searchMore(seek,offset);
} }
@ -76,4 +78,40 @@ public class SearchContentPresenter extends BasePresenter<ISearchContentContract
},500); },500);
} }
@Override
public void searchAlbum(String seek, int offset) {
mModel.searchAlbum(seek,offset);
}
@Override
public void searchAlbumSuccess(List<Album.DataBean> albumList) {
if(isAttachView()){
getMvpView().searchAlbumSuccess(albumList);
}
}
@Override
public void searchAlbumError() {
if(isAttachView()){
getMvpView().searchAlbumError();
}
}
@Override
public void searchAlbumMore(String seek, int offset) {
mModel.searchAlbumMore(seek,offset);
}
@Override
public void searchAlbumMoreSuccess(final List<Album.DataBean> songListBeans) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if(isAttachView()){
getMvpView().searchAlbumMoreSuccess(songListBeans);
}
}
},500);
}
} }

@ -2,8 +2,13 @@ package com.example.musicplayer.util;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.support.annotation.Nullable;
import android.text.Html; import android.text.Html;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
@ -14,8 +19,15 @@ import android.widget.Toast;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition;
import com.example.musicplayer.R; import com.example.musicplayer.R;
import com.example.musicplayer.constant.MyApplication; import com.example.musicplayer.constant.MyApplication;
import com.example.musicplayer.view.PlayActivity;
import java.io.IOException;
/** /**
* Created by on 2018/10/26. * Created by on 2018/10/26.
@ -34,7 +46,7 @@ public class CommonUtil {
View.SYSTEM_UI_FLAG_LAYOUT_STABLE); View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT); activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} }
}else { } else {
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
activity.getWindow().setStatusBarColor(MyApplication.getContext().getResources().getColor(R.color.actionBarColor)); activity.getWindow().setStatusBarColor(MyApplication.getContext().getResources().getColor(R.color.actionBarColor));
} }
@ -70,13 +82,14 @@ public class CommonUtil {
} }
return context.getResources().getDisplayMetrics().heightPixels; return context.getResources().getDisplayMetrics().heightPixels;
} }
/** /**
* EditText * EditText
*/ */
//弹出软键盘 //弹出软键盘
public static void showKeyboard(EditText editText,Context context) { public static void showKeyboard(EditText editText, Context context) {
//其中editText为dialog中的输入框的 EditText //其中editText为dialog中的输入框的 EditText
if(editText!=null){ if (editText != null) {
//设置可获得焦点 //设置可获得焦点
editText.setFocusable(true); editText.setFocusable(true);
editText.setFocusableInTouchMode(true); editText.setFocusableInTouchMode(true);
@ -90,8 +103,9 @@ public class CommonUtil {
/** /**
* *
*
* @param mEditText * @param mEditText
* @param context * @param context
*/ */
public static void closeKeybord(EditText mEditText, Context context) { public static void closeKeybord(EditText mEditText, Context context) {
mEditText.clearFocus(); mEditText.clearFocus();
@ -102,9 +116,57 @@ public class CommonUtil {
/** /**
* 使 * 使
*/ */
public static void showStringColor(String appointStr, String originalStr, TextView textView){ public static void showStringColor(String appointStr, String originalStr, TextView textView) {
originalStr = originalStr.replaceAll(appointStr, "<font color='#FFC66D'>" + appointStr+ "</font>"); originalStr = originalStr.replaceAll(appointStr, "<font color='#FFC66D'>" + appointStr + "</font>");
textView.setText(Html.fromHtml(originalStr)); textView.setText(Html.fromHtml(originalStr));
} }
//获取状态栏高度
public static int getStatusHeightPx(Activity act) {
int height = 0;
int resourceId = act.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
height = act.getResources().getDimensionPixelSize(resourceId);
}
return height;
}
//高斯模糊
public static Drawable getForegroundDrawable(Bitmap bitmap) {
/*得到屏幕的宽高比,以便按比例切割图片一部分*/
final float widthHeightSize = (float) (DisplayUtil.getScreenWidth(MyApplication.getContext())
* 1.0 / DisplayUtil.getScreenHeight(MyApplication.getContext()) * 1.0);
int cropBitmapWidth = (int) (widthHeightSize * bitmap.getHeight());
int cropBitmapWidthX = (int) ((bitmap.getWidth() - cropBitmapWidth) / 2.0);
/*切割部分图片*/
Bitmap cropBitmap = Bitmap.createBitmap(bitmap, cropBitmapWidthX, 0, cropBitmapWidth,
bitmap.getHeight());
/*缩小图片*/
Bitmap scaleBitmap = Bitmap.createScaledBitmap(cropBitmap, bitmap.getWidth() / 50, bitmap
.getHeight() / 50, false);
/*模糊化*/
final Bitmap blurBitmap = FastBlurUtil.doBlur(scaleBitmap, 5, true);
final Drawable foregroundDrawable = new BitmapDrawable(blurBitmap);
/*加入灰色遮罩层,避免图片过亮影响其他控件*/
return foregroundDrawable;
}
public static Bitmap getImgBitmap(Context context,String imgUrl){
SimpleTarget target = new SimpleTarget<Drawable>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
@Override
public void onResourceReady(@Nullable Drawable resource, Transition<? super Drawable> transition) {
Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
}
};
Glide.with(context)
.load(imgUrl)
.apply(RequestOptions.placeholderOf(R.drawable.welcome))
.apply(RequestOptions.errorOf(R.drawable.welcome))
.into(target);
return null;
}
} }

@ -0,0 +1,166 @@
package com.example.musicplayer.view;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition;
import com.example.musicplayer.R;
import com.example.musicplayer.util.CommonUtil;
import com.github.florent37.materialviewpager.MaterialViewPager;
import javax.microedition.khronos.opengles.GL;
/**
* Created by on 2018/11/25.
*/
public class AlbumContentFragment extends Fragment {
public static final String ALBUM_ID_KEY="id";
private static final String ALBUM_NAME_KEY="albumName";
private static final String SINGER_NAME_KEY="singerName";
private static final String ALBUM_PIC_KEY="albumPic";
public static final String PUBLIC_TIEM_KEY="publicTime";
private String mAlbumName,mSingerNmae,mAlbumPic,mPublicTime,mId;
private MaterialViewPager mViewPager;
private Toolbar toolbar;
private RelativeLayout mAlbumBackground;
private TextView mSingerNameTv;
private TextView mPublicTimeTv;
private ImageView mAlbumPicIv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getBundle();
View view = inflater.inflate(R.layout.fragment_album_content, container, false);
mViewPager = view.findViewById(R.id.materialViewPager);
toolbar = mViewPager.getToolbar();
mAlbumBackground = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.relative_album);
mAlbumPicIv = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.iv_album);
mSingerNameTv = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.tv_singer_name);
mPublicTimeTv = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.tv_public_time);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
}
private void initView(){
toolbar.setTitle(mAlbumName);
SimpleTarget target = new SimpleTarget<Drawable>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
@Override
public void onResourceReady(@Nullable Drawable resource, Transition<? super Drawable> transition) {
Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
mAlbumBackground.setBackground(CommonUtil.getForegroundDrawable(bitmap));
mAlbumPicIv.setImageBitmap(bitmap);
}
};
Glide.with(getActivity())
.load(mAlbumPic)
.apply(RequestOptions.placeholderOf(R.drawable.welcome))
.apply(RequestOptions.errorOf(R.drawable.welcome))
.into(target);
mSingerNameTv.setText("歌手 "+mSingerNmae);
mPublicTimeTv.setText("发行时间 "+mPublicTime);
toolbar.setTitleTextColor(getActivity().getResources().getColor(R.color.white));
if (toolbar != null) {
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
final ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
}
}
mViewPager.getViewPager().setAdapter(new FragmentStatePagerAdapter(getActivity().getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return AlbumSongFragment.newInstance(AlbumSongFragment.ALBUM_SONG,mId,mPublicTime);
case 1:
return AlbumSongFragment.newInstance(AlbumSongFragment.ALBUM_INFORATION,mId,mPublicTime);
default:
return null;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "歌曲列表";
case 1:
return "专辑信息";
}
return "";
}
});
mViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager());
mViewPager.getPagerTitleStrip().setIndicatorColorResource(R.color.yellow);
mViewPager.getPagerTitleStrip().setTabBackground(R.color.tab);
mViewPager.getPagerTitleStrip().setTextColorStateListResource(R.color.white);
}
public static Fragment newInstance(String id,String albumName,String albumPic,String singerName,String publicTime){
AlbumContentFragment albumContentFragment = new AlbumContentFragment();
Bundle bundle = new Bundle();
bundle.putString(ALBUM_ID_KEY,id);
bundle.putString(ALBUM_NAME_KEY,albumName);
bundle.putString(ALBUM_PIC_KEY,albumPic);
bundle.putString(SINGER_NAME_KEY,singerName);
bundle.putString(PUBLIC_TIEM_KEY,publicTime);
albumContentFragment.setArguments(bundle);
return albumContentFragment;
}
private void getBundle(){
Bundle bundle =getArguments();
if(bundle !=null){
mId =bundle.getString(ALBUM_ID_KEY);
mAlbumName = bundle.getString(ALBUM_NAME_KEY);
mAlbumPic = bundle.getString(ALBUM_PIC_KEY);
mSingerNmae = bundle.getString(SINGER_NAME_KEY);
mPublicTime = bundle.getString(PUBLIC_TIEM_KEY);
}
}
}

@ -0,0 +1,156 @@
package com.example.musicplayer.view;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.musicplayer.R;
import com.example.musicplayer.adapter.AlbumSongAdapter;
import com.example.musicplayer.adapter.SearchContentAdapter;
import com.example.musicplayer.constant.Constant;
import com.example.musicplayer.contract.IAlbumSongContract;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.AlbumSong;
import com.example.musicplayer.entiy.SeachSong;
import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.presenter.AlbumSongPresenter;
import com.example.musicplayer.util.CommonUtil;
import com.example.musicplayer.util.FileHelper;
import com.github.florent37.materialviewpager.MaterialViewPagerHelper;
import com.github.florent37.materialviewpager.header.MaterialViewPagerHeaderDecorator;
import java.util.List;
import static com.example.musicplayer.view.SearchContentFragment.IS_ONLINE;
/**
* Created by on 2018/11/25.
*/
public class AlbumSongFragment extends Fragment implements IAlbumSongContract.View{
private static final String TYPE_KEY = "type_key";
public static final int ALBUM_SONG = 0;
public static final int ALBUM_INFORATION = 1;
private AlbumSongPresenter mPresenter;
private String mId;
private NestedScrollView mScrollView;
private TextView mNameTv,mSingerTv,mDescTv,mCompany,mPublicTimeTv;
private int mType;
private String mPublicTime;
private String mDesc;
private List<AlbumSong.DataBean.SongsBean> mSongsList;
private RecyclerView mRecycle;
private LinearLayoutManager mLinearManager;
private AlbumSongAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getBundle();
View view = null;
if (mType == ALBUM_SONG) {
view = inflater.inflate(R.layout.fragment_album_recycler, container, false);
mRecycle = view.findViewById(R.id.recycler_song_list);
} else {
view = inflater.inflate(R.layout.fragment_album_song, container, false);
mScrollView = view.findViewById(R.id.scrollView);
mDescTv = view.findViewById(R.id.tv_desc);
mNameTv = view.findViewById(R.id.tv_album_name);
mSingerTv = view.findViewById(R.id.tv_singer);
mCompany = view.findViewById(R.id.tv_company);
mPublicTimeTv = view.findViewById(R.id.tv_public_time);
}
return view;
}
@Override
public void onActivityCreated(Bundle save) {
super.onActivityCreated(save);
MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView);
mPresenter =new AlbumSongPresenter();
mPresenter.attachView(this);
mPresenter.getAlbumDetail(mId,mType);
initView();
}
private void initView(){
}
private void getBundle(){
Bundle bundle = getArguments();
if (bundle != null) {
mType = bundle.getInt(TYPE_KEY);
mId =bundle.getString(AlbumContentFragment.ALBUM_ID_KEY);
mPublicTime = bundle.getString(AlbumContentFragment.PUBLIC_TIEM_KEY);
}
}
public static Fragment newInstance(int type, String id,String publicTime) {
AlbumSongFragment fragment = new AlbumSongFragment();
Bundle bundle = new Bundle();
bundle.putInt(TYPE_KEY, type);
bundle.putString(AlbumContentFragment.ALBUM_ID_KEY,id);
bundle.putString(AlbumContentFragment.PUBLIC_TIEM_KEY, publicTime);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void setAlbumSongList(final List<AlbumSong.DataBean.SongsBean> songList) {
mLinearManager =new LinearLayoutManager(getActivity());
mRecycle.setLayoutManager(mLinearManager);
mAdapter =new AlbumSongAdapter(songList);
mRecycle.addItemDecoration(new MaterialViewPagerHeaderDecorator());
mRecycle.setAdapter(mAdapter);
mAdapter.setSongClick(new AlbumSongAdapter.SongClick() {
@Override
public void onClick(int position) {
AlbumSong.DataBean.SongsBean dataBean= songList.get(position);
Song song = new Song();
song.setArtist(dataBean.getSinger());
song.setTitle(dataBean.getName());
song.setUrl(dataBean.getUrl());
song.setImgUrl(dataBean.getPic());
song.setCurrent(FileHelper.getSong() == null ? 0 : FileHelper.getSong().getCurrent());
FileHelper.saveSong(song);
Intent intent = new Intent(getActivity(), PlayActivity.class);
intent.putExtra(IS_ONLINE, true);
startActivity(intent);
}
});
}
@Override
public void showAlbumSongError() {
CommonUtil.showToast(getActivity(),"获取专辑信息失败");
}
@Override
public void showAlbumMessage(String name, String singer, String company, String desc) {
mNameTv.setText(name);
mSingerTv.setText(singer);
mCompany.setText(company);
mDescTv.setText(desc);
mPublicTimeTv.setText(mPublicTime);
}
@Override
public void showNetError() {
CommonUtil.showToast(getActivity(),"网络错误");
}
}

@ -0,0 +1,118 @@
package com.example.musicplayer.view;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.example.musicplayer.R;
import com.example.musicplayer.adapter.SearchAdapter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* Created by on 2018/11/25.
*/
public class ContentFragment extends Fragment {
private List<String> mTitleList;
private List<Fragment> mFragments;
private ViewPager mPager;
private SearchAdapter mAdapter;
private TabLayout mTabLayout;
private String[] mTitles = {"歌曲", "专辑"};
private String[] mTypes = {"song", "album"};
private Bundle mBundle;
private String mSeek;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_content, container, false);
mBundle = getArguments();
if (mBundle != null) {
mSeek = mBundle.getString(SearchContentFragment.SEEK_KEY);
}
mPager = view.findViewById(R.id.page);
mTabLayout = view.findViewById(R.id.tab_layout);
mTitleList = new ArrayList<>();
mFragments = new ArrayList<>();
initTab();
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
private void initTab() {
for (int i = 0; i < mTitles.length; i++) {
mTitleList.add(mTitles[i]);
mFragments.add(SearchContentFragment.newInstance(mSeek, mTypes[i]));
}
mAdapter = new SearchAdapter(getChildFragmentManager(), mFragments, mTitleList);
mPager.setAdapter(mAdapter);
mTabLayout.setupWithViewPager(mPager);
mTabLayout.post(new Runnable() {
@Override
public void run() {
setIndicator(mTabLayout, 50, 50);
}
});
}
public static Fragment newInstance(String seek) {
ContentFragment fragment = new ContentFragment();
Bundle bundle = new Bundle();
bundle.putString(SearchContentFragment.SEEK_KEY, seek);
fragment.setArguments(bundle);
return fragment;
}
//修改tab指示线大小
public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());
for (int i = 0; i < llTab.getChildCount(); i++) {
View child = llTab.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
params.leftMargin = left;
params.rightMargin = right;
child.setLayoutParams(params);
child.invalidate();
}
}
}

@ -74,7 +74,6 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract.
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
intentFilter=new IntentFilter(); intentFilter=new IntentFilter();
intentFilter.addAction(BroadcastName.LOCAL_SONG_CHANGE_LIST); intentFilter.addAction(BroadcastName.LOCAL_SONG_CHANGE_LIST);
songChangeReceiver=new SongChangeLocalMusicReceiver(); songChangeReceiver=new SongChangeLocalMusicReceiver();

@ -4,23 +4,22 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.Bundle; import android.os.Bundle;
import android.provider.SyncStateContract;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.EditText;
import com.example.musicplayer.R; import com.example.musicplayer.R;
import com.example.musicplayer.adapter.SearchContentAdapter; import com.example.musicplayer.adapter.SearchContentAdapter;
import com.example.musicplayer.constant.BroadcastName; import com.example.musicplayer.constant.BroadcastName;
import com.example.musicplayer.constant.Constant; import com.example.musicplayer.constant.Constant;
import com.example.musicplayer.contract.ISearchContentContract; import com.example.musicplayer.contract.ISearchContentContract;
import com.example.musicplayer.entiy.Album;
import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.SeachSong;
import com.example.musicplayer.entiy.Song; import com.example.musicplayer.entiy.Song;
import com.example.musicplayer.presenter.SearchContentPresenter; import com.example.musicplayer.presenter.SearchContentPresenter;
@ -30,89 +29,99 @@ import com.github.jdsjlzx.interfaces.OnLoadMoreListener;
import com.github.jdsjlzx.interfaces.OnNetWorkErrorListener; import com.github.jdsjlzx.interfaces.OnNetWorkErrorListener;
import com.github.jdsjlzx.recyclerview.LRecyclerView; import com.github.jdsjlzx.recyclerview.LRecyclerView;
import com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter; import com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter;
import com.github.jdsjlzx.recyclerview.ProgressStyle;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
/** /**
* Created by on 2018/11/21. * Created by on 2018/11/21.
*/ */
public class SearchContentFragment extends Fragment implements ISearchContentContract.View{ public class SearchContentFragment extends Fragment implements ISearchContentContract.View {
private static final String TAG="SearchContentFragment"; private static final String TAG = "SearchContentFragment";
public static final String IS_ONLINE="online"; public static final String TYPE_KEY = "type";
private int mOffset=1; //用于翻页搜索 public static final String SEEK_KEY = "seek";
public static final String IS_ONLINE = "online";
private int mOffset = 1; //用于翻页搜索
private String mAlbumName,mSingerName,mAlbumPic,mPublicTime;
private SearchContentPresenter mPresenter; private SearchContentPresenter mPresenter;
private LRecyclerView mRecycler; private LRecyclerView mRecycler;
private LinearLayoutManager manager; private LinearLayoutManager manager;
private SearchContentAdapter mAdapter; private SearchContentAdapter mAdapter;
private ArrayList<SeachSong.DataBean> mSongList=new ArrayList<>(); private ArrayList<SeachSong.DataBean> mSongList = new ArrayList<>();
private List<Album.DataBean> mAlbumList;
private SongFinishReceiver songChangeReceiver; private SongFinishReceiver songChangeReceiver;
private IntentFilter intentFilter; private IntentFilter intentFilter;
private LRecyclerViewAdapter mLRecyclerViewAdapter;//下拉刷新 private LRecyclerViewAdapter mLRecyclerViewAdapter;//下拉刷新
private Bundle mBundle;
private String mSeek;
private String mType;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_search_content,container,false); View view = inflater.inflate(R.layout.fragment_search_content, container, false);
mBundle = getArguments();
if (mBundle != null) {
mSeek = mBundle.getString(SEEK_KEY);
mType = mBundle.getString(TYPE_KEY);
}
mRecycler = view.findViewById(R.id.recycler_song_list);
mPresenter = new SearchContentPresenter();
mPresenter.attachView(this);
if (mType.equals("song")) {
mPresenter.search(mSeek, 1);
} else if (mType.equals("album")) {
mPresenter.searchAlbum(mSeek, 1);
}
searchMore();
return view; return view;
} }
@Override @Override
public void onActivityCreated(Bundle savedInstanceState){ public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
mRecycler = getActivity().findViewById(R.id.recycler_song_list);
manager = new LinearLayoutManager(getActivity()); manager = new LinearLayoutManager(getActivity());
mPresenter = new SearchContentPresenter();
mPresenter.attachView(this);
mPresenter.search(getSeekContent(),1);
//注册广播 //注册广播
intentFilter = new IntentFilter(); intentFilter = new IntentFilter();
intentFilter.addAction(BroadcastName.ONLINE_SONG_FINISH); intentFilter.addAction(BroadcastName.ONLINE_SONG_FINISH);
SongFinishReceiver songFinishReceiver = new SongFinishReceiver(); SongFinishReceiver songFinishReceiver = new SongFinishReceiver();
getActivity().registerReceiver(songFinishReceiver,intentFilter); getActivity().registerReceiver(songFinishReceiver, intentFilter);
searchMore();
} }
@Override
public String getSeekContent() {
Log.d(TAG, "getSeekContent: "+getArguments().getString("seek"));
return getArguments().getString("seek").trim();
}
@Override @Override
public void setSongsList(final ArrayList<SeachSong.DataBean> songListBeans) { public void setSongsList(final ArrayList<SeachSong.DataBean> songListBeans) {
mSongList.addAll(songListBeans); mSongList.addAll(songListBeans);
mAdapter = new SearchContentAdapter(mSongList,getSeekContent(),getActivity()); mAdapter = new SearchContentAdapter(mSongList, mSeek, getActivity(), Constant.TYPE_SONG);
mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter); mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter);
mRecycler.setLayoutManager(manager); mRecycler.setLayoutManager(manager);
mRecycler.setAdapter(mLRecyclerViewAdapter); mRecycler.setAdapter(mLRecyclerViewAdapter);
mAdapter.setItemClick(new SearchContentAdapter.ItemClick() { mAdapter.setItemClick(new SearchContentAdapter.ItemClick() {
@Override @Override
public void onClick(int position) { public void onClick(int position) {
SeachSong.DataBean dataBean = mSongList.get(position); SeachSong.DataBean dataBean = mSongList.get(position);
Song song= new Song(); Song song = new Song();
song.setArtist(dataBean.getSinger()); song.setArtist(dataBean.getSinger());
song.setTitle(dataBean.getName()); song.setTitle(dataBean.getName());
song.setUrl(dataBean.getUrl()); song.setUrl(dataBean.getUrl());
song.setImgUrl(dataBean.getPic()); song.setImgUrl(dataBean.getPic());
song.setCurrent(FileHelper.getSong()==null?0:FileHelper.getSong().getCurrent()); song.setCurrent(FileHelper.getSong() == null ? 0 : FileHelper.getSong().getCurrent());
FileHelper.saveSong(song); FileHelper.saveSong(song);
Intent intent=new Intent(getActivity(),PlayActivity.class); Intent intent = new Intent(getActivity(), PlayActivity.class);
intent.putExtra(IS_ONLINE,true); intent.putExtra(IS_ONLINE, true);
startActivity(intent); startActivity(intent);
} }
}); });
@ -120,7 +129,7 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon
@Override @Override
public void searchMoreSuccess(ArrayList<SeachSong.DataBean> songListBeans) { public void searchMoreSuccess(ArrayList<SeachSong.DataBean> songListBeans) {
Log.d(TAG, "searchMoreSuccess: success="+songListBeans.size()); Log.d(TAG, "searchMoreSuccess: success=" + songListBeans.size());
mSongList.addAll(songListBeans); mSongList.addAll(songListBeans);
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
mRecycler.refreshComplete(Constant.OFFSET); mRecycler.refreshComplete(Constant.OFFSET);
@ -139,20 +148,24 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon
@Override @Override
public void onLoadMore() { public void onLoadMore() {
mOffset += 1; mOffset += 1;
Log.d(TAG, "onLoadMore: mOffset="+mOffset); Log.d(TAG, "onLoadMore: mOffset=" + mOffset);
mPresenter.searchMore(getSeekContent(),mOffset); if (mType.equals("song")) {
mPresenter.searchMore(mSeek, mOffset);
}else{
mPresenter.searchAlbumMore(mSeek,mOffset);
}
} }
}); });
//设置底部加载颜色 //设置底部加载颜色
mRecycler.setFooterViewColor(R.color.colorAccent, R.color.musicStyle_low ,R.color.translucent); mRecycler.setFooterViewColor(R.color.colorAccent, R.color.musicStyle_low, R.color.translucent);
//设置底部加载文字提示 //设置底部加载文字提示
mRecycler.setFooterViewHint("拼命加载中","已经全部为你呈现了","网络不给力啊,点击再试一次吧"); mRecycler.setFooterViewHint("拼命加载中", "已经全部为你呈现了", "网络不给力啊,点击再试一次吧");
} }
@Override @Override
public void showError() { public void showError() {
CommonUtil.showToast(getActivity(),"连接超时"); CommonUtil.showToast(getActivity(), "连接超时");
} }
@Override @Override
@ -161,10 +174,54 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon
@Override @Override
public void reload() { public void reload() {
mOffset += 1; mOffset += 1;
mPresenter.searchMore(getSeekContent(),mOffset); mPresenter.searchMore(mSeek, mOffset);
} }
}); });
} }
@Override
public void searchAlbumSuccess(final List<Album.DataBean> 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);
mAdapter.setAlbumClick(new SearchContentAdapter.AlbumClick() {
@Override
public void onClick(int position) {
toAlbumContentFragment(mAlbumList.get(position));
}
});
}
@Override
public void searchAlbumMoreSuccess(List<Album.DataBean> songListBeans) {
mAlbumList.addAll(songListBeans);
mAdapter.notifyDataSetChanged();
mRecycler.refreshComplete(Constant.OFFSET);
}
@Override
public void searchAlbumError() {
CommonUtil.showToast(getActivity(), "获取专辑信息失败");
}
/**
* fragment
*
* @param type
*/
public static Fragment newInstance(String seek, String type) {
SearchContentFragment fragment = new SearchContentFragment();
Bundle bundle = new Bundle();
bundle.putString(TYPE_KEY, type);
bundle.putString(SEEK_KEY, seek);
fragment.setArguments(bundle);
return fragment;
}
class SongFinishReceiver extends BroadcastReceiver { class SongFinishReceiver extends BroadcastReceiver {
@Override @Override
@ -172,4 +229,16 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
} }
} }
public void toAlbumContentFragment(Album.DataBean album){
FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
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);
//将事务提交到返回栈
transaction.addToBackStack(null);
transaction.commit();
}
} }

@ -23,7 +23,6 @@ public class SearchFragment extends Fragment {
private static final String TAG = "SearchFragment"; private static final String TAG = "SearchFragment";
private EditText mSeekEdit; private EditText mSeekEdit;
private TextView mSeekTv; private TextView mSeekTv;
private SearchContentFragment mSearchContentFragment;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -62,12 +61,7 @@ public class SearchFragment extends Fragment {
FragmentManager manager = getActivity().getSupportFragmentManager(); FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction(); FragmentTransaction transaction = manager.beginTransaction();
mSearchContentFragment = new SearchContentFragment(); transaction.replace(R.id.container, ContentFragment.newInstance(mSeekEdit.getText().toString()));
Bundle bundle = new Bundle();
Log.d(TAG, "seek:" + mSeekEdit.getText().toString());
bundle.putString("seek", mSeekEdit.getText().toString());
mSearchContentFragment.setArguments(bundle);
transaction.replace(R.id.container, mSearchContentFragment);
transaction.commit(); transaction.commit();
} }
} }

@ -0,0 +1,36 @@
package com.example.musicplayer.widget;
import android.content.Context;
import android.support.v4.widget.DrawerLayout;
import android.util.AttributeSet;
/**
* Created by on 2018/11/26.
*/
public class CustomDrawerLayout extends DrawerLayout {
public CustomDrawerLayout(Context context) {
super(context);
}
public CustomDrawerLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
widthMeasureSpec = MeasureSpec.makeMeasureSpec(
MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(
MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true"
android:clipToPadding="false"
>
<View
android:layout_width="match_parent"
android:layout_height="25dp"
android:background="@color/actionBarColor"/>
<com.github.florent37.materialviewpager.MaterialViewPager
android:fitsSystemWindows="true"
android:clipToPadding="false"
android:id="@+id/materialViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:viewpager_logoMarginTop="100dp"
app:viewpager_color="@color/actionBarColor"
app:viewpager_headerHeight="300dp"
app:viewpager_hideToolbarAndTitle="false"
app:viewpager_header="@layout/header"
app:viewpager_headerAdditionalHeight="-13dp"
app:viewpager_disableToolbar="false"
/>
</LinearLayout>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_song_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="65dp">
</android.support.v7.widget.RecyclerView>
</LinearLayout>

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/material_view_pager_placeholder" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/translucent"
android:orientation="vertical"
android:paddingStart="15dp">
<View
android:layout_width="match_parent"
android:layout_height="0.1dip"
android:background="@color/line"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="专辑"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_album_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="我很忙"
android:textColor="@color/white_blue"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.1dip"
android:background="@color/line" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="歌手"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_singer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="周杰伦"
android:textColor="@color/white_blue"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.1dip"
android:background="@color/line"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="唱片公司"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_company"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="杰威尔音乐"
android:textColor="@color/white_blue"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.1dip"
android:background="@color/line" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="发行时间"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_public_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="2007-11-01"
android:textColor="@color/white_blue"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="@color/line" />
<TextView
android:textColor="@color/white_blue"
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="20dp"
android:layout_marginBottom="20dp"
android:lineSpacingMultiplier="1.5"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="@color/line"
android:layout_marginBottom="50dp"/>
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</LinearLayout>

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:background="@color/tab"
android:layout_width="match_parent"
android:layout_height="40dp"
style="@style/MyTabLayoutStyle">
</android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/page"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</LinearLayout>

@ -3,11 +3,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="@color/seekColor">
</View>
<com.github.jdsjlzx.recyclerview.LRecyclerView <com.github.jdsjlzx.recyclerview.LRecyclerView
android:id="@+id/recycler_song_list" android:id="@+id/recycler_song_list"

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/relative_album"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/jay">
<android.support.v7.widget.CardView
android:id="@+id/iv_album_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
android:layout_marginStart="30dp"
app:cardCornerRadius="5dp"
android:layout_marginTop="80dp"
>
<ImageView
android:id="@+id/iv_album"
android:layout_width="130dp"
android:layout_height="130dp"
android:scaleType="centerCrop"
android:src="@drawable/jay"
/>
</android.support.v7.widget.CardView>
<LinearLayout
android:layout_marginTop="125dp"
android:layout_toRightOf="@+id/iv_album_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_singer_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="歌手 周杰伦"
android:textColor="@color/white"/>
<TextView
android:id="@+id/tv_public_time"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="发行时间 2007-11-01"
android:textColor="@color/white_easy"/>
</LinearLayout>
</RelativeLayout>

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/logo_white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<android.support.v7.widget.CardView
android:id="@+id/iv_album_pic"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginEnd="15dp"
android:layout_marginStart="15dp"
app:cardCornerRadius="5dp">
<ImageView
android:id="@+id/iv_album"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:src="@drawable/jay"
/>
</android.support.v7.widget.CardView>
</LinearLayout>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<com.astuetz.PagerSlidingTabStrip
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@id/materialviewpager_pagerTitleStrip"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:pstsPaddingMiddle="true"
app:pstsDividerPadding="20dp"
app:pstsIndicatorColor="#FFF"
app:pstsIndicatorHeight="2dp"
app:pstsShouldExpand="true"
app:pstsTabPaddingLeftRight="10dp"
app:pstsTabTextAllCaps="true"
tools:background="#A333"
/>

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/translucent">
<android.support.v7.widget.CardView
android:id="@+id/iv_album_pic"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_marginEnd="15dp"
android:layout_marginStart="15dp"
app:cardCornerRadius="5dp">
<ImageView
android:id="@+id/iv_album"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:src="@drawable/welcome"
/>
</android.support.v7.widget.CardView>
<LinearLayout
android:layout_toRightOf="@+id/iv_album_pic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_album_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="我很忙"
android:singleLine="true"
android:ellipsize="end"
android:paddingEnd="20dp"
android:textColor="@color/white"
android:textSize="16sp"
/>
<TextView
android:id="@+id/tv_singer_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="周杰伦"
android:ellipsize="end"
android:maxLines="1"
android:textSize="14sp"
android:textColor="@color/white"
/>
<TextView
android:id="@+id/tv_public_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="2007-11-01"
android:ellipsize="end"
android:textSize="12sp"
android:maxLines="1"
android:textColor="@color/white"
android:layout_marginBottom="3dp"
/>
</LinearLayout>
<View
android:layout_toRightOf="@+id/iv_album_pic"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="0.1dip"
android:background="@color/gray" />
</RelativeLayout>

@ -48,6 +48,6 @@
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dip" android:layout_height="0.1dip"
android:background="@color/gray" /> android:background="@color/gray" />
</RelativeLayout> </RelativeLayout>

@ -13,10 +13,13 @@
<color name="seekColor">#80FFFFFF</color> <color name="seekColor">#80FFFFFF</color>
<color name="translucent">#80010738</color> <color name="translucent">#80010738</color>
<color name="click">#99010738</color> <color name="click">#99010738</color>
<color name="tab">#2e3259</color>
<color name="actionBarColor">#050e41</color> <color name="actionBarColor">#050e41</color>
<color name="transparent">#00000000</color> <color name="transparent">#00000000</color>
<color name="musicStyle_low">#2ad3df</color> <color name="musicStyle_low">#2ad3df</color>
<color name="player">#081038</color> <color name="player">#081038</color>
<color name="white_easy">#bcb9b9</color> <color name="white_easy">#bcb9b9</color>
<color name="yellow">#FFC66D</color> <color name="yellow">#FFC66D</color>
<color name="white_blue">#caeefc</color>
<color name="line">#a7bfc4</color>
</resources> </resources>

@ -14,8 +14,20 @@
<item name="colorAccent">@color/musicStyle</item> <item name="colorAccent">@color/musicStyle</item>
</style> </style>
<!-- 修改tablayout的背景色提示线的颜色字体颜色等-->
<style name="MyTabLayoutStyle" parent="android:Widget">
<item name="tabBackground">@color/tab</item>
<item name="tabIndicatorColor">@color/yellow</item>
<item name="tabIndicatorHeight">2dp</item>
<item name="tabTextAppearance">@style/TextAppearance.Design.Tab</item>
<item name="tabSelectedTextColor">@color/yellow</item>
</style>
<style name="TextAppearance.Design.Tab" parent="TextAppearance.AppCompat.Button">
<item name="android:textSize">15sp</item>
<item name="android:textColor">@color/white</item>
<item name="textAllCaps">true</item>
</style>
<style name="neteasa_music_time_text_sytle"> <style name="neteasa_music_time_text_sytle">
@ -25,11 +37,12 @@
<item name="android:textSize">9sp</item> <item name="android:textSize">9sp</item>
</style> </style>
<style name="neteasa_music_time_seek_bar_sytle" <style name="neteasa_music_time_seek_bar_sytle" parent="Widget.AppCompat.SeekBar">
parent="Widget.AppCompat.SeekBar">
<item name="android:layout_width">match_parent</item> <item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:thumb">@drawable/ic_seekbar_thumb</item> <item name="android:thumb">@drawable/ic_seekbar_thumb</item>
</style> </style>
</resources> </resources>

Loading…
Cancel
Save