package com.example.musicplayer.view.search; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; 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.util.Log; import android.widget.ImageView; import com.example.musicplayer.R; import com.example.musicplayer.adapter.SearchContentAdapter; import com.example.musicplayer.app.Api; import com.example.musicplayer.app.Constant; import com.example.musicplayer.base.fragment.BaseLoadingFragment; import com.example.musicplayer.contract.ISearchContentContract; import com.example.musicplayer.entiy.Album; import com.example.musicplayer.entiy.DownloadSong; import com.example.musicplayer.entiy.SearchSong; import com.example.musicplayer.entiy.Song; import com.example.musicplayer.event.OnlineSongChangeEvent; import com.example.musicplayer.event.OnlineSongErrorEvent; import com.example.musicplayer.presenter.SearchContentPresenter; import com.example.musicplayer.service.PlayerService; import com.example.musicplayer.util.CommonUtil; import com.example.musicplayer.util.DownloadUtil; import com.example.musicplayer.util.FileUtil; import com.github.jdsjlzx.recyclerview.LRecyclerView; import com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.litepal.LitePal; import java.util.ArrayList; import java.util.List; import butterknife.BindView; /** * Created by 残渊 on 2018/11/21. */ public class SearchContentFragment extends BaseLoadingFragment<SearchContentPresenter> implements ISearchContentContract.View { private static final String TAG = "SearchContentFragment"; public static final String TYPE_KEY = "type"; public static final String SEEK_KEY = "seek"; public static final String IS_ONLINE = "online"; private int mOffset = 1; //用于翻页搜索 private SearchContentPresenter mPresenter; private LinearLayoutManager manager; private SearchContentAdapter mAdapter; private ArrayList<SearchSong.DataBean.SongBean.ListBean> mSongList = new ArrayList<>(); private List<Album.DataBean.AlbumBean.ListBean> mAlbumList; private LRecyclerViewAdapter mLRecyclerViewAdapter;//下拉刷新 @BindView(R.id.normalView) LRecyclerView mRecycler; @BindView(R.id.iv_background) ImageView mBackgroundIv; private Bundle mBundle; private String mSeek; private String mType; private PlayerService.PlayStatusBinder mPlayStatusBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mPlayStatusBinder = (PlayerService.PlayStatusBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void loadData() { if (mType.equals("song")) { mPresenter.search(mSeek, 1); } else if (mType.equals("album")) { mPresenter.searchAlbum(mSeek, 1); } searchMore(); } @Override public void reload() { super.reload(); if (mType.equals("song")) { mPresenter.search(mSeek, 1); } else if (mType.equals("album")) { mPresenter.searchAlbum(mSeek, 1); } } @Override protected int getLayoutId() { return R.layout.fragment_search_content; } @Override protected void initView() { super.initView(); EventBus.getDefault().register(this); mBundle = getArguments(); if (mBundle != null) { mSeek = mBundle.getString(SEEK_KEY); mType = mBundle.getString(TYPE_KEY); } manager = new LinearLayoutManager(mActivity); //启动服务 Intent playIntent = new Intent(getActivity(), PlayerService.class); mActivity.bindService(playIntent, connection, Context.BIND_AUTO_CREATE); } @Override protected SearchContentPresenter getPresenter() { mPresenter = new SearchContentPresenter(); return mPresenter ; } @Subscribe(threadMode = ThreadMode.MAIN) public void onOnlineSongChangeEvent(OnlineSongChangeEvent event){ if(mAdapter!= null) mAdapter.notifyDataSetChanged(); } @Subscribe(threadMode = ThreadMode.MAIN) public void onOnlineSongErrorEvent(OnlineSongErrorEvent event){ showToast("抱歉该歌曲暂没有版权,搜搜其他歌曲吧"); } @Override public void onDestroy() { super.onDestroy(); mActivity.unbindService(connection); EventBus.getDefault().unregister(this); } @Override public void setSongsList(final ArrayList<SearchSong.DataBean.SongBean.ListBean> songListBeans) { mSongList.addAll(songListBeans); mAdapter = new SearchContentAdapter(mSongList, mSeek, getActivity(), Constant.TYPE_SONG); mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter); mRecycler.setLayoutManager(manager); mRecycler.setAdapter(mLRecyclerViewAdapter); //点击播放 SearchContentAdapter.setItemClick(position -> { SearchSong.DataBean.SongBean.ListBean dataBean = mSongList.get(position); Song song = new Song(); song.setSongId(dataBean.getSongmid()); song.setSinger(getSinger(dataBean)); song.setSongName(dataBean.getSongname()); song.setImgUrl(Api.ALBUM_PIC+dataBean.getAlbummid()+Api.JPG); song.setDuration(dataBean.getInterval()); song.setOnline(true); song.setMediaId(dataBean.getStrMediaMid()); song.setDownload(DownloadUtil.isExistOfDownloadSong(dataBean.getSongmid())); //网络获取歌曲地址 mPresenter.getSongUrl(song); }); } @Override public void searchMoreSuccess(ArrayList<SearchSong.DataBean.SongBean.ListBean> songListBeans) { mSongList.addAll(songListBeans); mAdapter.notifyDataSetChanged(); mRecycler.refreshComplete(Constant.OFFSET); } @Override public void searchMoreError() { mRecycler.setNoMore(true); } @Override public void searchMore() { mRecycler.setPullRefreshEnabled(false); mRecycler.setOnLoadMoreListener(() -> { mOffset += 1; Log.d(TAG, "onLoadMore: mOffset=" + 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.transparent); //设置底部加载文字提示 mRecycler.setFooterViewHint("拼命加载中", "已经全部为你呈现了", "网络不给力啊,点击再试一次吧"); } @Override public void showSearcherMoreNetworkError() { mRecycler.setOnNetWorkErrorListener(() -> { mOffset += 1; mPresenter.searchMore(mSeek, mOffset); }); } @Override public void searchAlbumSuccess(final List<Album.DataBean.AlbumBean.ListBean> albumList) { mAlbumList = new ArrayList<>(); mAlbumList.addAll(albumList); mAdapter = new SearchContentAdapter(mAlbumList, mSeek, getActivity(), Constant.TYPE_ALBUM); mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter); mRecycler.setLayoutManager(manager); mRecycler.setAdapter(mLRecyclerViewAdapter); SearchContentAdapter.setAlbumClick(position -> toAlbumContentFragment(mAlbumList.get(position))); } @Override public void searchAlbumMoreSuccess(List<Album.DataBean.AlbumBean.ListBean> songListBeans) { mAlbumList.addAll(songListBeans); mAdapter.notifyDataSetChanged(); mRecycler.refreshComplete(Constant.OFFSET); } @Override public void searchAlbumError() { CommonUtil.showToast(getActivity(), "获取专辑信息失败"); } @Override public void getSongUrlSuccess(Song song,String url) { song.setUrl(url); FileUtil.saveSong(song); mPlayStatusBinder.playOnline(); } /** * 构造带参数的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; } public void toAlbumContentFragment(Album.DataBean.AlbumBean.ListBean 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(); } //获取歌手,因为歌手可能有很多个 private String getSinger( SearchSong.DataBean.SongBean.ListBean dataBean){ StringBuilder singer = new StringBuilder(dataBean.getSinger().get(0).getName()); for (int i = 1; i < dataBean.getSinger().size(); i++) { singer.append("、").append(dataBean.getSinger().get(i).getName()); } return singer.toString(); } }