Skip to content

Commit ba8c8e0

Browse files
author
Bakumon
committed
🚶增加上拉加载更多效果
1 parent 6e9572f commit ba8c8e0

19 files changed

Lines changed: 815 additions & 87 deletions

app/src/main/java/me/bakumon/ugank/module/category/CategoryContract.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ interface View extends BaseView {
2323
void showSwipLoading();
2424

2525
void hideSwipLoading();
26+
27+
void setLoading();
2628
}
2729

2830
interface Presenter extends BasePresenter {

app/src/main/java/me/bakumon/ugank/module/category/CategoryFragment.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import android.support.v4.app.Fragment;
77
import android.support.v4.widget.SwipeRefreshLayout;
88
import android.support.v7.widget.LinearLayoutManager;
9-
import android.support.v7.widget.RecyclerView;
109
import android.view.LayoutInflater;
1110
import android.view.View;
1211
import android.view.ViewGroup;
@@ -16,17 +15,19 @@
1615
import me.bakumon.ugank.GlobalConfig;
1716
import me.bakumon.ugank.R;
1817
import me.bakumon.ugank.entity.CategoryResult;
19-
import me.bakumon.ugank.widget.LoadMore;
2018
import me.bakumon.ugank.widget.RecycleViewDivider;
19+
import me.bakumon.ugank.widget.recyclerviewwithfooter.DefaultFootItem;
20+
import me.bakumon.ugank.widget.recyclerviewwithfooter.OnLoadMoreListener;
21+
import me.bakumon.ugank.widget.recyclerviewwithfooter.RecyclerViewWithFooter;
2122

2223
/**
2324
* CategoryFragment
2425
* Created by bakumon on 2016/12/8.
2526
*/
26-
public class CategoryFragment extends Fragment implements CategoryContract.View, SwipeRefreshLayout.OnRefreshListener, LoadMore.OnLoadMoreListener {
27+
public class CategoryFragment extends Fragment implements CategoryContract.View, SwipeRefreshLayout.OnRefreshListener, OnLoadMoreListener {
2728

2829
@BindView(R.id.recycler_view)
29-
RecyclerView mRecyclerView;
30+
RecyclerViewWithFooter mRecyclerView;
3031
@BindView(R.id.swipe_refresh_layout)
3132
SwipeRefreshLayout mSwipeRefreshLayout;
3233

@@ -68,15 +69,13 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
6869
R.color.colorSwipeRefresh6);
6970
mSwipeRefreshLayout.setOnRefreshListener(this);
7071

71-
LoadMore loadMore = new LoadMore(mRecyclerView);
72-
loadMore.setOnLoadMoreListener(this);
73-
7472
mAndroidListAdapter = new CategoryListAdapter(getContext());
7573

7674
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
7775
mRecyclerView.addItemDecoration(new RecycleViewDivider(getActivity(), LinearLayoutManager.HORIZONTAL));
7876
mRecyclerView.setAdapter(mAndroidListAdapter);
79-
77+
mRecyclerView.setOnLoadMoreListener(this);
78+
mRecyclerView.setEmpty();
8079
return view;
8180
}
8281

@@ -129,6 +128,11 @@ public void onLoadMore() {
129128
mPresenter.getAndroidItems(GlobalConfig.PAGE_SIZE_CATEGORY, mPage, false);
130129
}
131130

131+
@Override
132+
public void setLoading() {
133+
mRecyclerView.setLoading();
134+
}
135+
132136
@Override
133137
public void getAndroidItemsFail(String failMessage, final int number, final int page, final boolean isRefresh) {
134138
if (getUserVisibleHint()) {

app/src/main/java/me/bakumon/ugank/module/category/CategoryPresenter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,15 @@ public void onCompleted() {
5555
public void onError(Throwable e) {
5656
mCategoryView.hideSwipLoading();
5757
mCategoryView.getAndroidItemsFail(mCategoryView.getCategoryName() + " 列表数据获取失败,请重试。201"
58-
, number, page, isRefresh);
58+
, number, page, isRefresh);
5959
}
6060

6161
@Override
6262
public void onNext(CategoryResult androidResult) {
6363
if (isRefresh) {
6464
mCategoryView.setAndroidItems(androidResult);
6565
mCategoryView.hideSwipLoading();
66+
mCategoryView.setLoading();
6667
} else {
6768
mCategoryView.addAndroidItems(androidResult);
6869
}

app/src/main/java/me/bakumon/ugank/module/search/SearchActivity.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import android.support.v7.widget.AppCompatEditText;
1111
import android.support.v7.widget.AppCompatImageView;
1212
import android.support.v7.widget.LinearLayoutManager;
13-
import android.support.v7.widget.RecyclerView;
1413
import android.support.v7.widget.Toolbar;
1514
import android.text.Editable;
1615
import android.text.TextWatcher;
@@ -27,10 +26,11 @@
2726
import me.bakumon.ugank.utills.DisplayUtils;
2827
import me.bakumon.ugank.utills.KeyboardUtils;
2928
import me.bakumon.ugank.utills.MDTintUtil;
30-
import me.bakumon.ugank.widget.LoadMore;
3129
import me.bakumon.ugank.widget.RecycleViewDivider;
30+
import me.bakumon.ugank.widget.recyclerviewwithfooter.OnLoadMoreListener;
31+
import me.bakumon.ugank.widget.recyclerviewwithfooter.RecyclerViewWithFooter;
3232

33-
public class SearchActivity extends AppCompatActivity implements SearchContract.View, TextWatcher, TextView.OnEditorActionListener, LoadMore.OnLoadMoreListener {
33+
public class SearchActivity extends AppCompatActivity implements SearchContract.View, TextWatcher, TextView.OnEditorActionListener, OnLoadMoreListener {
3434

3535
@BindView(R.id.toolbar_search)
3636
Toolbar mToolbarSearch;
@@ -43,12 +43,11 @@ public class SearchActivity extends AppCompatActivity implements SearchContract.
4343
@BindView(R.id.appbar_search)
4444
AppBarLayout mAppbarSearch;
4545
@BindView(R.id.recycler_view_search)
46-
RecyclerView mRecyclerViewSearch;
46+
RecyclerViewWithFooter mRecyclerViewSearch;
4747
@BindView(R.id.swipe_refresh_layout_search)
4848
SwipeRefreshLayout mSwipeRefreshLayoutSearch;
4949

5050
private SearchContract.Presenter mSearchPresenter = new SearchPresenter(this);
51-
private LoadMore mLoadMore;
5251

5352
private int mPage = 1;
5453
private SearchListAdapter mSearchListAdapter;
@@ -84,10 +83,6 @@ public void onClick(View view) {
8483
}
8584
});
8685

87-
mLoadMore = new LoadMore(mRecyclerViewSearch);
88-
mLoadMore.setOnLoadMoreListener(this);
89-
mLoadMore.setIsLastPage(true);
90-
9186
mEdSearch.addTextChangedListener(this);
9287
mEdSearch.setOnEditorActionListener(this);
9388

@@ -105,6 +100,8 @@ public void onClick(View view) {
105100
mRecyclerViewSearch.setLayoutManager(new LinearLayoutManager(this));
106101
mRecyclerViewSearch.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL));
107102
mRecyclerViewSearch.setAdapter(mSearchListAdapter);
103+
mRecyclerViewSearch.setOnLoadMoreListener(this);
104+
mRecyclerViewSearch.setEmpty();
108105

109106
}
110107

@@ -173,8 +170,18 @@ public void showTip(String msg) {
173170
}
174171

175172
@Override
176-
public void setLoadMoreIsLastPage(boolean isLastPage) {
177-
mLoadMore.setIsLastPage(isLastPage);
173+
public void setLoadMoreIsLastPage() {
174+
mRecyclerViewSearch.setEnd("没有更多数据了");
175+
}
176+
177+
@Override
178+
public void setEmpty() {
179+
mRecyclerViewSearch.setEmpty();
180+
}
181+
182+
@Override
183+
public void setLoading() {
184+
mRecyclerViewSearch.setLoading();
178185
}
179186

180187
@Override
@@ -185,8 +192,10 @@ public void onLoadMore() {
185192

186193
@OnClick(R.id.iv_edit_clear)
187194
public void editClear() {
195+
mRecyclerViewSearch.setEmpty();
188196
mEdSearch.setText("");
189197
KeyboardUtils.showSoftInput(this, mEdSearch);
198+
mSearchPresenter.unsubscribe();
190199
}
191200

192201
@OnClick(R.id.iv_search)
@@ -212,6 +221,8 @@ public void afterTextChanged(Editable editable) {
212221
showEditClear();
213222
} else {
214223
hideEditClear();
224+
mRecyclerViewSearch.setEmpty();
225+
mSearchPresenter.unsubscribe();
215226
}
216227
mSearchListAdapter.mData = null;
217228
mSearchListAdapter.notifyDataSetChanged();

app/src/main/java/me/bakumon/ugank/module/search/SearchContract.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ interface View extends BaseView {
3131

3232
void showTip(String msg);
3333

34-
void setLoadMoreIsLastPage(boolean isLastPage);
34+
void setLoadMoreIsLastPage();
35+
36+
void setEmpty();
37+
38+
void setLoading();
3539
}
3640

3741
interface Presenter extends BasePresenter {

app/src/main/java/me/bakumon/ugank/module/search/SearchPresenter.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public void onCompleted() {
6363
@Override
6464
public void onError(Throwable e) {
6565
mView.showSearchFail("搜索出错了,请重试", searchText, page, isLoadMore);
66+
mView.hideSwipLoading();
6667
}
6768

6869
@Override
@@ -71,17 +72,17 @@ public void onNext(SearchResult searchResult) {
7172
if (searchResult == null || searchResult.count == 0) {
7273
mView.showTip("没有搜索到结果");
7374
mView.hideSwipLoading();
75+
mView.setEmpty();
7476
return;
7577
}
76-
mView.setLoadMoreIsLastPage(false);
7778
mView.setSearchItems(searchResult);
79+
mView.setLoading();
7880
} else {
81+
mView.addSearchItems(searchResult);
7982
boolean isLastPage = searchResult.count < GlobalConfig.PAGE_SIZE_CATEGORY;
8083
if (isLastPage) {
81-
mView.showTip("已经是最后一页了");
84+
mView.setLoadMoreIsLastPage();
8285
}
83-
mView.setLoadMoreIsLastPage(isLastPage);
84-
mView.addSearchItems(searchResult);
8586
}
8687

8788
}

app/src/main/java/me/bakumon/ugank/widget/LoadMore.java

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package me.bakumon.ugank.widget.recyclerviewwithfooter;
2+
3+
import android.text.TextUtils;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.ImageView;
8+
import android.widget.TextView;
9+
10+
import me.bakumon.ugank.R;
11+
12+
13+
/**
14+
* 默认的空数据视图
15+
*
16+
* @author cjj on 16/1/31.
17+
*/
18+
public class DefaultEmptyItem extends EmptyItem {
19+
20+
private TextView mEmptyTextView;
21+
private ImageView mEmptyImageView;
22+
23+
@Override
24+
public View onCreateView(ViewGroup parent) {
25+
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_with_footer_empty_layout, parent, false);
26+
view.setLayoutParams(new ViewGroup.LayoutParams(parent.getMeasuredWidth(), parent.getMeasuredHeight()));
27+
mEmptyTextView = (TextView) view.findViewById(R.id.rv_with_footer_empty_title);
28+
mEmptyImageView = (ImageView) view.findViewById(R.id.rv_with_footer_empty_icon);
29+
return view;
30+
}
31+
32+
@Override
33+
public void onBindData(View view) {
34+
if (TextUtils.isEmpty(mEmptyText)) {
35+
mEmptyTextView.setVisibility(View.GONE);
36+
} else {
37+
mEmptyTextView.setVisibility(View.VISIBLE);
38+
mEmptyTextView.setText(mEmptyText);
39+
}
40+
41+
if (mEmptyIconRes != -1) {
42+
mEmptyImageView.setImageResource(mEmptyIconRes);
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)