课前准备
- 搜索推荐接口
- 方法:get
- 接口:search/recommend
- 参数:无
{
"success": true,
"code": 10000,
"message": "获取成功",
"data": [
{
"id": "1218067349282762752",
"keyword": "毛衣",
"createTime": "2020-01-17 15:07"
},
{
"id": "1218067383944491008",
"keyword": "面膜",
"createTime": "2020-01-17 15:07"
},
{
"id": "1218067422200737792",
"keyword": "巧克力",
"createTime": "2020-01-17 15:07"
},
{
"id": "1218067443742683136",
"keyword": "礼物",
"createTime": "2020-01-17 15:08"
},
{
"id": "1218067465729224704",
"keyword": "情人节",
"createTime": "2020-01-17 15:08"
},
{
"id": "1218067486180651008",
"keyword": "年货",
"createTime": "2020-01-17 15:08"
},
{
"id": "1218067540752740352",
"keyword": "洁面乳",
"createTime": "2020-01-17 15:08"
},
{
"id": "1218067581072584704",
"keyword": "祛螨虫",
"createTime": "2020-01-17 15:08"
},
{
"id": "1218067637485973504",
"keyword": "零食",
"createTime": "2020-01-17 15:08"
},
{
"id": "1218067755073286144",
"keyword": "良品铺子",
"createTime": "2020-01-17 15:09"
}
]
}
课堂笔记
定义搜索页面接口
- 搜索页面接口定义比前面的三个页面相对来说还是比较复杂的,但老师讲的也是比较详细的,每个方法都有备注
- presenter 层接口:ISearchPresenter
public interface ISearchPresenter extends IBasePresenter<ISearchCallback> {
// 获取搜索历史内容
void getHistories();
// 删除历史搜索内容
void delHistories();
// 搜索
void doSearch(String keyword);
// 重新搜索
void reSearch();
// 获取更多的搜索内容
void loaderMore();
// 获取推荐词
void getRecommendWords();
}
public interface ISearchCallback extends IBaseCallback {
// 当获得历史搜索
void onHistoriesLoaded(List<String> histories);
// 当删除历史搜索
void onHistoriesDeleted();
// 当搜索成功
void onSearchSuccess(SearchResult result);
// 加载更多成功
void onMoreLoaded(SearchResult result);
// 加载更多失败
void onMoreLoadedError();
// 加载更多为空
void onMoreLoadedEmpty();
// 当获取关键词时
void onRecommendWordsLoaded(List<SearchRecommend.DataBean> recommendWords);
}
实现方法逻辑
- 创建 SearchPresenterImpl 实现接口 ISearchPresenter
- 在 SearchPresenterImpl 构造方法中初始化 Api mApi
private final Api mApi;
public SearchPresenterImpl() {
Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
mApi = retrofit.create(Api.class);
}
- 创建 SearchResult 和 SearchRecommend 类,并在 Api 中添加方法 getSearchResult 和 getSearchRecommend
@GET("search")
Call<SearchResult> getSearchResult(@Query("page") int page, @Query("keyword") String keyword);
@GET("search/recommend")
Call<SearchRecommend> getSearchRecommend();
搜索推荐:getRecommendWords
@Override
public void getRecommendWords() {
Call<SearchRecommend> task = mApi.getSearchRecommend();
task.enqueue(new Callback<SearchRecommend>() {
@Override
public void onResponse(Call<SearchRecommend> call, Response<SearchRecommend> response) {
int code = response.code();
if (code == HttpURLConnection.HTTP_OK) {
if (mCallback != null) {
mCallback.onRecommendWordsLoaded(response.body().getData());
}
}
}
@Override
public void onFailure(Call<SearchRecommend> call, Throwable t) {
}
});
}
搜索:doSearch
public static final int DEFAULT_PAGE = 0;
private int mCurrentPage = DEFAULT_PAGE;
private String mCurrentKeyword = null;
@Override
public void doSearch(String keyword) {
if (mCurrentKeyword == null || !mCurrentKeyword.equals(keyword)) {
this.mCurrentKeyword = keyword;
}
// 数据加载中
if (mCallback != null) {
mCallback.onLoading();
}
Call<SearchResult> task = mApi.getSearchResult(mCurrentPage, keyword);
task.enqueue(new Callback<SearchResult>() {
@Override
public void onResponse(Call<SearchResult> call, Response<SearchResult> response) {
int code = response.code();
if (code == HttpURLConnection.HTTP_OK) {
SearchResult result = response.body();
// 加载数据成功
handleSearchResult(result);
} else {
// 加载数据失败
onError();
}
}
@Override
public void onFailure(Call<SearchResult> call, Throwable t) {
// 加载数据失败
onError();
}
});
}
private void onError() {
if (mCallback != null) {
mCallback.onError();
}
}
private void handleSearchResult(SearchResult result) {
if (mCallback != null) {
// 判断结果是否为空
if (isResultEmpty(result)) {
mCallback.onEmpty();
} else {
mCallback.onSearchSuccess(result);
}
}
}
- 其中方法 isResultEmpty 是判断加载成功时数据是否为空
private boolean isResultEmpty(SearchResult result) {
try {
return result == null || result.getData().getTbk_dg_material_optional_response()
.getResult_list().getMap_data().size() == 0;
} catch (Exception e) {
return false;
}
}
重新搜索:reSearch
- 用搜索时保存的 mCurrentKeyword,重新执行方法 doSearch
@Override
public void reSearch() {
if (mCurrentKeyword != null) {
this.doSearch(mCurrentKeyword);
}
}
加载更多:loaderMore
@Override
public void loaderMore() {
mCurrentPage++;
if (mCurrentKeyword != null) {
Call<SearchResult> task = mApi.getSearchResult(mCurrentPage, mCurrentKeyword);
task.enqueue(new Callback<SearchResult>() {
@Override
public void onResponse(Call<SearchResult> call, Response<SearchResult> response) {
int code = response.code();
if (code == HttpURLConnection.HTTP_OK) {
SearchResult loadMoreResult = response.body();
// 加载更多成功
handleLoadMoreSearchResult(loadMoreResult);
} else {
// 加载更多失败
onLoadMoreError();
}
}
@Override
public void onFailure(Call<SearchResult> call, Throwable t) {
// 加载更多失败
onLoadMoreError();
}
});
}
}
private void onLoadMoreError() {
mCurrentPage--;
if (mCallback != null) {
mCallback.onMoreLoadedError();
}
}
- 加载成功时要判断加载的内容是否为空,如果为空,页面数减一
private void handleLoadMoreSearchResult(SearchResult loadMoreResult) {
if (mCallback != null) {
if (isResultEmpty(loadMoreResult)) {
mCurrentPage--;
mCallback.onMoreLoadedEmpty();
} else {
mCallback.onMoreLoaded(loadMoreResult);
}
}
}
视频链接