From d5a63ffa487a3df83843b4bd385d8a04aae35a80 Mon Sep 17 00:00:00 2001 From: jsyjst Date: Fri, 23 Nov 2018 20:16:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=90=9C=E7=B4=A2=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E4=B8=8A=E6=BB=91=E5=8A=A0=E8=BD=BD=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 8 ++ .../musicplayer/constant/Constant.java | 9 +++ .../contract/ISearchContentContract.java | 13 +++- .../musicplayer/https/api/SearchApi.java | 4 +- .../musicplayer/model/SearchContentModel.java | 47 ++++++++++-- .../presenter/SearchContentPresenter.java | 45 +++++++++++- .../musicplayer/service/PlayerService.java | 5 ++ .../view/SearchContentFragment.java | 69 ++++++++++++++++-- .../musicplayer/view/SearchFragment.java | 11 +++ .../res/drawable-xxhdpi/iconfont_downgrey.png | Bin 0 -> 486 bytes .../res/layout/fragment_search_content.xml | 4 +- app/src/main/res/values/colors.xml | 2 +- 12 files changed, 198 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/example/musicplayer/constant/Constant.java create mode 100644 app/src/main/res/drawable-xxhdpi/iconfont_downgrey.png diff --git a/app/build.gradle b/app/build.gradle index 6f63a4d..9b02d2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,6 +17,12 @@ android { } } } +allprojects { + repositories { + jcenter() + maven { url "https://jitpack.io" } + } +} dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) @@ -42,4 +48,6 @@ dependencies { implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' //glide implementation 'com.github.bumptech.glide:glide:4.8.0' + //LRecyclerView + implementation 'com.github.jdsjlzx:LRecyclerView:1.5.4.3' } diff --git a/app/src/main/java/com/example/musicplayer/constant/Constant.java b/app/src/main/java/com/example/musicplayer/constant/Constant.java new file mode 100644 index 0000000..4a817f4 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/constant/Constant.java @@ -0,0 +1,9 @@ +package com.example.musicplayer.constant; + +/** + * Created by 残渊 on 2018/11/23. + */ + +public class Constant { + public static final int OFFSET=30; +} diff --git a/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java b/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java index 0206ff9..d246db6 100644 --- a/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java +++ b/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java @@ -10,17 +10,26 @@ import java.util.ArrayList; public interface ISearchContentContract { interface Model{ - void search(String seek); //搜索 + void search(String seek,int offset); //搜索 + void searchMore(String seek,int offset); //搜索更多 } interface View{ String getSeekContent(); //获得搜索的内容 void setSongsList(ArrayList songListBeans); //显示歌曲列表 + void searchMoreSuccess(ArrayList songListBeans); //搜索更多内容成功 + void searchMoreError(); //搜索更多内容失败 + void searchMore();//搜索更多 void showError(); + void showSearcherMoreNetworkError();//下拉刷新网络错误 } interface Presenter{ - void search(String seek); //搜索 + void search(String seek,int offset); //搜索 + void searchMore(String seek,int offset); //搜索更多 void searchSuccess(ArrayList songListBeans); //搜索成功 void searchError(); //搜索失败 + void searchMoreSuccess(ArrayList songListBeans); //搜索更多内容成功 + void searchMoreError(); //搜索更多内容失败 + void showSearchMoreNetworkError();//下拉刷新网络错误 } } diff --git a/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java b/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java index 2b4272e..76485f6 100644 --- a/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java +++ b/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java @@ -15,6 +15,6 @@ import retrofit2.http.Query; */ public interface SearchApi { - @GET("search?key=579621905&type=song&limit=30&offset=0") - Observable search(@Query("s") String seek); + @GET("search?key=579621905&type=song&limit=30") + Observable search(@Query("s") String seek,@Query("offset")int offset); } diff --git a/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java b/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java index ef121ba..1532504 100644 --- a/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java +++ b/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java @@ -18,16 +18,16 @@ import io.reactivex.schedulers.Schedulers; */ public class SearchContentModel implements ISearchContentContract.Model { - private static final String TAG="SearchContentModel"; + private static final String TAG = "SearchContentModel"; private ISearchContentContract.Presenter mPresenter; - public SearchContentModel(ISearchContentContract.Presenter presenter){ + public SearchContentModel(ISearchContentContract.Presenter presenter) { mPresenter = presenter; } @Override - public void search(String seek) { - NetWork.getSearchApi().search(seek) + public void search(String seek, int offset) { + NetWork.getSearchApi().search(seek, offset) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override @@ -43,7 +43,7 @@ public class SearchContentModel implements ISearchContentContract.Model { @Override public void onError(Throwable e) { mPresenter.searchError(); - Log.d(TAG, "onError: "+e.toString()); + Log.d(TAG, "onError: " + e.toString()); } @Override @@ -53,4 +53,41 @@ public class SearchContentModel implements ISearchContentContract.Model { }); } + + @Override + public void searchMore(String seek, int offset) { + NetWork.getSearchApi().search(seek, offset) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(SeachSong value) { + if (value.getResult().equals("SUCCESS")) { + Log.d(TAG, "onNext: success"); + if (value.getData().size() == 0) { + mPresenter.searchMoreError(); + } else { + mPresenter.searchMoreSuccess((ArrayList) value.getData()); + } + } else { + mPresenter.searchMoreError(); + } + } + + @Override + public void onError(Throwable e) { + mPresenter.showSearchMoreNetworkError(); + Log.d(TAG, "onError: " + e.toString()); + } + + @Override + public void onComplete() { + + } + }); + } } diff --git a/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java b/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java index ce1014a..0bc477f 100644 --- a/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java +++ b/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java @@ -6,6 +6,7 @@ import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.model.SearchContentModel; import java.util.ArrayList; +import java.util.logging.Handler; /** * Created by 残渊 on 2018/11/21. @@ -14,18 +15,25 @@ import java.util.ArrayList; public class SearchContentPresenter extends BasePresenter implements ISearchContentContract.Presenter { private SearchContentModel mModel; + private android.os.Handler mHandler = new android.os.Handler(); public SearchContentPresenter(){ mModel = new SearchContentModel(this); } @Override - public void search(String seek) { - mModel.search(seek); + public void search(String seek,int offset) { + mModel.search(seek,offset); + } + + @Override + public void searchMore(String seek, int offset) { + mModel.searchMore(seek,offset); } @Override public void searchSuccess(ArrayList songListBeans) { + if(isAttachView()){ getMvpView().setSongsList(songListBeans); } @@ -35,4 +43,37 @@ public class SearchContentPresenter extends BasePresenter songListBeans) { + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + if(isAttachView()){ + getMvpView().searchMoreSuccess(songListBeans); + } + } + },500); + + } + + @Override + public void searchMoreError() { + if(isAttachView()){ + getMvpView().searchMoreError(); + } + } + + @Override + public void showSearchMoreNetworkError() { + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + if(isAttachView()){ + getMvpView().showSearcherMoreNetworkError(); + } + } + },500); + + } } diff --git a/app/src/main/java/com/example/musicplayer/service/PlayerService.java b/app/src/main/java/com/example/musicplayer/service/PlayerService.java index 02107ea..b2e8f6e 100644 --- a/app/src/main/java/com/example/musicplayer/service/PlayerService.java +++ b/app/src/main/java/com/example/musicplayer/service/PlayerService.java @@ -8,9 +8,12 @@ import android.media.MediaPlayer; import android.os.Binder; import android.os.IBinder; import android.util.Log; +import android.widget.Toast; +import com.example.musicplayer.constant.MyApplication; import com.example.musicplayer.entiy.Mp3Info; import com.example.musicplayer.entiy.Song; +import com.example.musicplayer.util.CommonUtil; import com.example.musicplayer.util.FileHelper; import com.example.musicplayer.util.MediaUtil; @@ -42,6 +45,7 @@ public class PlayerService extends Service { mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { + mCurrent=FileHelper.getSong().getCurrent(); mCurrent++; Log.d(TAG, "-------onBind: 结束"); //将歌曲的信息保存起来 @@ -114,6 +118,7 @@ public class PlayerService extends Service { mediaPlayer.start(); sendBroadcast(new Intent("SONG_ONLINE")); }catch (Exception e){ + CommonUtil.showToast(MyApplication.getContext(),"抱歉该歌曲暂无版权"); e.printStackTrace(); } } diff --git a/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java b/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java index 7d545ea..6d029ef 100644 --- a/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java @@ -3,6 +3,7 @@ package com.example.musicplayer.view; import android.content.Intent; import android.media.MediaPlayer; import android.os.Bundle; +import android.provider.SyncStateContract; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -14,12 +15,18 @@ import android.widget.EditText; import com.example.musicplayer.R; import com.example.musicplayer.adapter.SearchContentAdapter; +import com.example.musicplayer.constant.Constant; import com.example.musicplayer.contract.ISearchContentContract; import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.Song; import com.example.musicplayer.presenter.SearchContentPresenter; import com.example.musicplayer.util.CommonUtil; import com.example.musicplayer.util.FileHelper; +import com.github.jdsjlzx.interfaces.OnLoadMoreListener; +import com.github.jdsjlzx.interfaces.OnNetWorkErrorListener; +import com.github.jdsjlzx.recyclerview.LRecyclerView; +import com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter; +import com.github.jdsjlzx.recyclerview.ProgressStyle; import java.io.IOException; import java.lang.reflect.Field; @@ -32,11 +39,15 @@ import java.util.ArrayList; public class SearchContentFragment extends Fragment implements ISearchContentContract.View{ private static final String TAG="SearchContentFragment"; public static final String IS_ONLINE="online"; + private int mOffset=1; //用于翻页搜索 private SearchContentPresenter mPresenter; - private RecyclerView mRecycler; + private LRecyclerView mRecycler; private LinearLayoutManager manager; private SearchContentAdapter mAdapter; + private ArrayList mSongList=new ArrayList<>(); + + private LRecyclerViewAdapter mLRecyclerViewAdapter;//下拉刷新 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -53,7 +64,9 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon mPresenter = new SearchContentPresenter(); mPresenter.attachView(this); - mPresenter.search(getSeekContent()); + mPresenter.search(getSeekContent(),1); + + searchMore(); } @@ -65,14 +78,19 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon @Override public void setSongsList(final ArrayList songListBeans) { - mAdapter = new SearchContentAdapter(songListBeans); + mSongList.addAll(songListBeans); + mAdapter = new SearchContentAdapter(mSongList); + mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter); mRecycler.setLayoutManager(manager); - mRecycler.setAdapter(mAdapter); + mRecycler.setAdapter(mLRecyclerViewAdapter); + + + mAdapter.setItemClick(new SearchContentAdapter.ItemClick() { @Override public void onClick(int position) { - SeachSong.DataBean dataBean = songListBeans.get(position); + SeachSong.DataBean dataBean = mSongList.get(position); Song song= new Song(); song.setArtist(dataBean.getSinger()); song.setTitle(dataBean.getName()); @@ -88,8 +106,49 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon }); } + @Override + public void searchMoreSuccess(ArrayList songListBeans) { + Log.d(TAG, "searchMoreSuccess: success="+songListBeans.size()); + mSongList.addAll(songListBeans); + mAdapter.notifyDataSetChanged(); + mRecycler.refreshComplete(Constant.OFFSET); + } + + @Override + public void searchMoreError() { + mRecycler.setNoMore(true); + } + + @Override + public void searchMore() { + mRecycler.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore() { + mOffset += 1; + Log.d(TAG, "onLoadMore: mOffset="+mOffset); + mPresenter.searchMore(getSeekContent(),mOffset); + } + }); + //设置底部加载颜色 + mRecycler.setFooterViewColor(R.color.colorAccent, R.color.musicStyle_low ,R.color.transparent); + //设置底部加载文字提示 + mRecycler.setFooterViewHint("拼命加载中","已经全部为你呈现了","网络不给力啊,点击再试一次吧"); + + } + @Override public void showError() { CommonUtil.showToast(getActivity(),"连接超时"); } + + @Override + public void showSearcherMoreNetworkError() { + mRecycler.setOnNetWorkErrorListener(new OnNetWorkErrorListener() { + @Override + public void reload() { + mOffset += 1; + mPresenter.searchMore(getSeekContent(),mOffset); + } + }); + } } diff --git a/app/src/main/java/com/example/musicplayer/view/SearchFragment.java b/app/src/main/java/com/example/musicplayer/view/SearchFragment.java index 878b112..3e04ec3 100644 --- a/app/src/main/java/com/example/musicplayer/view/SearchFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/SearchFragment.java @@ -6,6 +6,7 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; @@ -41,9 +42,19 @@ public class SearchFragment extends Fragment { @Override public void onClick(View v) { CommonUtil.closeKeybord(mSeekEdit, getActivity()); + mSeekEdit.setCursorVisible(false);//隐藏光标 replaceFragment(); } }); + mSeekEdit.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (MotionEvent.ACTION_DOWN == event.getAction()) { + mSeekEdit.setCursorVisible(true); + } + return false; + } + }); } //搜索后的页面 diff --git a/app/src/main/res/drawable-xxhdpi/iconfont_downgrey.png b/app/src/main/res/drawable-xxhdpi/iconfont_downgrey.png new file mode 100644 index 0000000000000000000000000000000000000000..42e1371c1d478465697302e3a160b09af4e3017f GIT binary patch literal 486 zcmV@P)uOi~h@6RW_fqQt2{mfjNB76z^*u?#DJCg)9ae(vK$;`DL z;cM6_#z8T=2}Hy@EMgZkSkKJu%$)5IJe!%@Sg*UgSS)5Yfs*)$As*D|7WOi8;Sb>p z*sEQ2cUY{kHR$qdmYLVFg|qmMRlLThS~-U+c!V?fhUJKO`8Reafs(j@=eSs-XSg}0 ze~%jx@u3U1vp`9l#s-!rtZd;TNfESdjJ3c07*qoM6N<$f-Qf|(EtDd literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_search_content.xml b/app/src/main/res/layout/fragment_search_content.xml index bdbad2a..9db4b4f 100644 --- a/app/src/main/res/layout/fragment_search_content.xml +++ b/app/src/main/res/layout/fragment_search_content.xml @@ -9,7 +9,7 @@ android:background="@color/seekColor"> - - + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b9093ae..c9ba24d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,7 +2,7 @@ #3F51B5 #303F9F - #FF4081 + #0ee5f4 #0ee5f4 #2124f4 #ffffff