增加搜索界面上滑加载更多逻辑

pull/1/head
jsyjst 7 years ago
parent 203f146574
commit d5a63ffa48

@ -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'
}

@ -0,0 +1,9 @@
package com.example.musicplayer.constant;
/**
* Created by on 2018/11/23.
*/
public class Constant {
public static final int OFFSET=30;
}

@ -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<SeachSong.DataBean> songListBeans); //显示歌曲列表
void searchMoreSuccess(ArrayList<SeachSong.DataBean> 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<SeachSong.DataBean> songListBeans); //搜索成功
void searchError(); //搜索失败
void searchMoreSuccess(ArrayList<SeachSong.DataBean> songListBeans); //搜索更多内容成功
void searchMoreError(); //搜索更多内容失败
void showSearchMoreNetworkError();//下拉刷新网络错误
}
}

@ -15,6 +15,6 @@ import retrofit2.http.Query;
*/
public interface SearchApi {
@GET("search?key=579621905&type=song&limit=30&offset=0")
Observable<SeachSong> search(@Query("s") String seek);
@GET("search?key=579621905&type=song&limit=30")
Observable<SeachSong> search(@Query("s") String seek,@Query("offset")int offset);
}

@ -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<SeachSong>() {
@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<SeachSong>() {
@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<SeachSong.DataBean>) value.getData());
}
} else {
mPresenter.searchMoreError();
}
}
@Override
public void onError(Throwable e) {
mPresenter.showSearchMoreNetworkError();
Log.d(TAG, "onError: " + e.toString());
}
@Override
public void onComplete() {
}
});
}
}

@ -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<ISearchContentContract.View>
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<SeachSong.DataBean> songListBeans) {
if(isAttachView()){
getMvpView().setSongsList(songListBeans);
}
@ -35,4 +43,37 @@ public class SearchContentPresenter extends BasePresenter<ISearchContentContract
public void searchError() {
getMvpView().showError();
}
@Override
public void searchMoreSuccess(final ArrayList<SeachSong.DataBean> 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);
}
}

@ -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();
}
}

@ -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<SeachSong.DataBean> 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<SeachSong.DataBean> 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<SeachSong.DataBean> 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);
}
});
}
}

@ -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;
}
});
}
//搜索后的页面

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

@ -9,7 +9,7 @@
android:background="@color/seekColor">
</View>
<android.support.v7.widget.RecyclerView
<com.github.jdsjlzx.recyclerview.LRecyclerView
android:background="@color/translucent"
android:id="@+id/recycler_song_list"
android:layout_width="match_parent"
@ -17,7 +17,7 @@
android:layout_marginBottom="65dp">
</android.support.v7.widget.RecyclerView>
</com.github.jdsjlzx.recyclerview.LRecyclerView>
</LinearLayout>

@ -2,7 +2,7 @@
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="colorAccent">#0ee5f4</color>
<color name="musicStyle">#0ee5f4</color>
<color name="purple">#2124f4</color>
<color name="white">#ffffff</color>

Loading…
Cancel
Save