Skip to content

Commit 408c9cf

Browse files
Merge pull request commons-app#9 from ashishkumar468/bugfix/pagination
Fixed the logic for pagination
2 parents d23d06f + f34281b commit 408c9cf

File tree

3 files changed

+73
-70
lines changed

3 files changed

+73
-70
lines changed

app/src/main/java/fr/free/nrw/commons/explore/depictions/SearchDepictionsFragment.java

Lines changed: 56 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,34 @@
11
package fr.free.nrw.commons.explore.depictions;
22

3+
import static android.view.View.GONE;
4+
import static android.view.View.VISIBLE;
5+
36
import android.content.Context;
47
import android.content.res.Configuration;
58
import android.os.Bundle;
69
import android.view.LayoutInflater;
710
import android.view.View;
811
import android.view.ViewGroup;
12+
import android.widget.LinearLayout;
913
import android.widget.ProgressBar;
1014
import android.widget.TextView;
11-
1215
import androidx.annotation.NonNull;
1316
import androidx.recyclerview.widget.GridLayoutManager;
1417
import androidx.recyclerview.widget.LinearLayoutManager;
1518
import androidx.recyclerview.widget.RecyclerView;
16-
17-
import com.pedrogomez.renderers.RVRendererAdapter;
18-
19-
import java.util.ArrayList;
20-
import java.util.List;
21-
import java.util.Locale;
22-
23-
import javax.inject.Inject;
24-
2519
import butterknife.BindView;
2620
import butterknife.ButterKnife;
21+
import com.pedrogomez.renderers.RVRendererAdapter;
2722
import fr.free.nrw.commons.R;
2823
import fr.free.nrw.commons.depictions.DepictedImagesActivity;
2924
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
3025
import fr.free.nrw.commons.upload.structure.depicts.DepictedItem;
3126
import fr.free.nrw.commons.utils.NetworkUtils;
3227
import fr.free.nrw.commons.utils.ViewUtil;
33-
34-
import static android.view.View.GONE;
35-
import static android.view.View.VISIBLE;
28+
import java.util.ArrayList;
29+
import java.util.List;
30+
import java.util.Locale;
31+
import javax.inject.Inject;
3632

3733
/**
3834
* Display depictions in search fragment
@@ -48,9 +44,10 @@ public class SearchDepictionsFragment extends CommonsDaggerSupportFragment imple
4844
TextView depictionNotFound;
4945
@BindView(R.id.bottomProgressBar)
5046
ProgressBar bottomProgressBar; int i=0;
51-
LinearLayoutManager layoutManager;
47+
RecyclerView.LayoutManager layoutManager;
5248
private boolean hasMoreImages = true;
5349
private boolean isLoading = true;
50+
private int PAGE_SIZE = 25;
5451
@Inject
5552
SearchDepictionsFragmentPresenter presenter;
5653
private final SearchDepictionsAdapterFactory adapterFactory = new SearchDepictionsAdapterFactory(new SearchDepictionsRenderer.DepictCallback() {
@@ -67,49 +64,60 @@ public void fetchThumbnailUrlForEntity(String entityId,int position) {
6764

6865
});
6966
private RVRendererAdapter<DepictedItem> depictionsAdapter;
67+
private boolean isLastPage;
7068

7169
@Override
7270
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
7371
View rootView = inflater.inflate(R.layout.fragment_browse_image, container, false);
7472
ButterKnife.bind(this, rootView);
75-
if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
76-
depictionsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
73+
if (getActivity().getResources().getConfiguration().orientation
74+
== Configuration.ORIENTATION_PORTRAIT) {
75+
layoutManager = new LinearLayoutManager(getContext());
7776
} else {
78-
depictionsRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
77+
layoutManager = new GridLayoutManager(getContext(), 2);
7978
}
79+
depictionsRecyclerView.setLayoutManager(layoutManager);
8080
ArrayList<DepictedItem> items = new ArrayList<>();
8181
depictionsAdapter = adapterFactory.create(items);
8282
depictionsRecyclerView.setAdapter(depictionsAdapter);
83-
layoutManager = new LinearLayoutManager(getActivity());
8483
depictionsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
8584
@Override
8685
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
8786
super.onScrollStateChanged(recyclerView, newState);
88-
// check if end of recycler view is reached, if yes then add more results to existing results
89-
/*if (!recyclerView.canScrollVertically(1)) {
90-
presenter.addDepictionsToList();
91-
}*/
9287
}
9388

9489
@Override
9590
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
9691
super.onScrolled(recyclerView, dx, dy);
92+
9793
int visibleItemCount = layoutManager.getChildCount();
9894
int totalItemCount = layoutManager.getItemCount();
99-
int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
100-
101-
if (!isLoading && (firstVisibleItemPosition + visibleItemCount >= totalItemCount)) {
102-
isLoading = true;
103-
presenter.updateDepictionList(presenter.getQuery());
104-
/*if (!hasMoreImages) {
105-
progressBar.setVisibility(GONE);
106-
}*/
95+
int firstVisibleItemPosition=0;
96+
if(layoutManager instanceof GridLayoutManager){
97+
firstVisibleItemPosition=((GridLayoutManager) layoutManager).findFirstVisibleItemPosition();
98+
}else{
99+
firstVisibleItemPosition=((LinearLayoutManager)layoutManager).findFirstVisibleItemPosition();
100+
}
101+
102+
if (!isLoading && !isLastPage) {
103+
if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount
104+
&& firstVisibleItemPosition >= 0
105+
&& totalItemCount >= PAGE_SIZE) {
106+
loadMoreItems();
107+
}
107108
}
108109
}
109110
});
110111
return rootView;
111112
}
112113

114+
/**
115+
* Fetch PAGE_SIZE number of items
116+
*/
117+
private void loadMoreItems() {
118+
presenter.updateDepictionList(presenter.getQuery(),PAGE_SIZE);
119+
}
120+
113121
@Override
114122
public void onAttach(Context context) {
115123
super.onAttach(context);
@@ -129,7 +137,7 @@ public void updateDepictionList(String query) {
129137
handleNoInternet();
130138
return;
131139
}
132-
presenter.updateDepictionList(query);
140+
loadMoreItems();
133141
}
134142

135143
/**
@@ -162,8 +170,13 @@ public void onSuccess(List<DepictedItem> mediaList) {
162170
progressBar.setVisibility(View.GONE);
163171
depictionNotFound.setVisibility(GONE);
164172
bottomProgressBar.setVisibility(GONE);
173+
int itemCount=layoutManager.getItemCount();
165174
depictionsAdapter.addAll(mediaList);
166-
depictionsAdapter.notifyDataSetChanged();
175+
if(itemCount!=0) {
176+
depictionsAdapter.notifyItemRangeInserted(itemCount, mediaList.size()-1);
177+
}else{
178+
depictionsAdapter.notifyDataSetChanged();
179+
}
167180
}
168181

169182
@Override
@@ -193,4 +206,15 @@ public void onImageUrlFetched(String response, int position) {
193206
depictionsAdapter.getItem(position).setImageUrl(response);
194207
depictionsAdapter.notifyItemChanged(position);
195208
}
209+
210+
/**
211+
* Inform the view that there are no more items to be loaded for this search query
212+
* or reset the isLastPage for the current query
213+
* @param isLastPage
214+
*/
215+
@Override
216+
public void setIsLastPage(boolean isLastPage) {
217+
this.isLastPage=isLastPage;
218+
progressBar.setVisibility(GONE);
219+
}
196220
}

app/src/main/java/fr/free/nrw/commons/explore/depictions/SearchDepictionsFragmentContract.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ interface View {
2727
RVRendererAdapter<DepictedItem> getAdapter();
2828

2929
void onImageUrlFetched(String response, int position);
30+
31+
void setIsLastPage(boolean isLastPage);
3032
}
3133

3234
interface UserActionListener extends BasePresenter<View> {
3335

34-
void addDepictionsToList();
35-
36-
void updateDepictionList(String query);
36+
void updateDepictionList(String query, int pageSize);
3737

3838
void saveQuery();
3939

app/src/main/java/fr/free/nrw/commons/explore/depictions/SearchDepictionsFragmentPresenter.java

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package fr.free.nrw.commons.explore.depictions;
22

3-
import android.widget.ImageView;
43
import java.lang.reflect.Proxy;
54
import java.util.ArrayList;
65
import java.util.Date;
@@ -42,6 +41,7 @@ public class SearchDepictionsFragmentPresenter extends CommonsDaggerSupportFragm
4241
JsonKvStore basicKvStore;
4342
private SearchDepictionsFragmentContract.View view = DUMMY;
4443
private List<DepictedItem> queryList = new ArrayList<>();
44+
int offset=0;
4545

4646
@Inject
4747
public SearchDepictionsFragmentPresenter(@Named("default_preferences") JsonKvStore basicKvStore, MediaWikiApi mwApi, RecentSearchesDao recentSearchesDao, DepictsClient depictsClient, MediaClient mediaClient) {
@@ -62,36 +62,18 @@ public void onDetachView() {
6262
this.view = DUMMY;
6363
}
6464

65-
/**
66-
* Adds 25 more results to existing search results
67-
*/
68-
@Override
69-
public void addDepictionsToList() {
70-
if (isLoadingDepictions) return;
71-
isLoadingDepictions = true;
72-
view.loadingDepictions();
73-
compositeDisposable.add(depictsClient.searchForDepictions(query, 25, queryList.size())
74-
.subscribeOn(Schedulers.io())
75-
.observeOn(AndroidSchedulers.mainThread())
76-
.timeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
77-
.collect(ArrayList<DepictedItem>::new, ArrayList::add)
78-
.subscribe(this::handlePaginationSuccess, this::handleError));
79-
}
80-
8165
/**
8266
* Called when user selects "Items" from Search Activity
8367
* to load the list of depictions from API
8468
*
8569
* @param query string searched in the Explore Activity
8670
*/
8771
@Override
88-
public void updateDepictionList(String query) {
72+
public void updateDepictionList(String query,int pageSize) {
8973
this.query = query;
90-
queryList.clear();
91-
view.clearAdapter();
9274
view.loadingDepictions();
9375
saveQuery();
94-
compositeDisposable.add(depictsClient.searchForDepictions(query, 25, queryList.size())
76+
compositeDisposable.add(depictsClient.searchForDepictions(query, 25, offset)
9577
.subscribeOn(Schedulers.io())
9678
.observeOn(AndroidSchedulers.mainThread())
9779
.timeout(TIMEOUT_SECONDS, TimeUnit.SECONDS)
@@ -100,17 +82,6 @@ public void updateDepictionList(String query) {
10082
.subscribe(this::handleSuccess, this::handleError));
10183
}
10284

103-
/**
104-
* Handles the success scenario
105-
* it initializes the recycler view by adding items to the adapter
106-
*/
107-
108-
private void handlePaginationSuccess(List<DepictedItem> mediaList) {
109-
queryList.addAll(mediaList);
110-
isLoadingDepictions = false;
111-
view.onSuccess(mediaList);
112-
}
113-
11485
/**
11586
* Logs and handles API error scenario
11687
*/
@@ -146,7 +117,10 @@ public void saveQuery() {
146117
@Override
147118
public void initializeQuery(String query) {
148119
this.query = query;
149-
120+
this.queryList.clear();
121+
offset=0;//Reset the offset on query change
122+
view.setIsLastPage(false);
123+
view.clearAdapter();
150124
}
151125

152126
@Override
@@ -160,11 +134,16 @@ public String getQuery() {
160134
*/
161135

162136
public void handleSuccess(List<DepictedItem> mediaList) {
163-
queryList = mediaList;
164137
if (mediaList == null || mediaList.isEmpty()) {
165-
view.initErrorView();
138+
if(queryList.isEmpty()){
139+
view.initErrorView();
140+
}else{
141+
view.setIsLastPage(true);
142+
}
166143
} else {
144+
this.queryList.addAll(mediaList);
167145
view.onSuccess(mediaList);
146+
offset=queryList.size();
168147
}
169148
}
170149

0 commit comments

Comments
 (0)