Skip to content

Commit ecebe4c

Browse files
Crash fixed due to notifyDataSetChange
1 parent c93bcda commit ecebe4c

File tree

6 files changed

+120
-4
lines changed

6 files changed

+120
-4
lines changed

app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,4 +250,24 @@ public void onBackPressed() {
250250
}
251251
super.onBackPressed();
252252
}
253+
254+
/**
255+
* This method is called on success of API call for Images inside a category.
256+
* The viewpager will notified that number of items have changed.
257+
*/
258+
public void viewPagerNotifyDataSetChanged() {
259+
if (mediaDetails!=null){
260+
mediaDetails.notifyDataSetChanged();
261+
}
262+
}
263+
264+
/**
265+
* This method is called when viewPager has reached its end.
266+
* Fetches more images using search query and adds it to the grid view and viewpager adapter
267+
*/
268+
public void requestMoreImages() {
269+
if (categoryImagesListFragment!=null){
270+
categoryImagesListFragment.fetchMoreImagesViewPager();
271+
}
272+
}
253273
}

app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,16 @@ public Media getMediaAtPosition(int i) {
170170
}
171171
}
172172

173+
/**
174+
* This method is called on success of API call for featured Images.
175+
* The viewpager will notified that number of items have changed.
176+
*/
177+
public void viewPagerNotifyDataSetChanged() {
178+
if (mediaDetails!=null){
179+
mediaDetails.notifyDataSetChanged();
180+
}
181+
}
182+
173183
/**
174184
* This method is called on from getCount of MediaDetailPagerFragment
175185
* The viewpager will contain same number of media items as that of media elements in adapter.
@@ -236,4 +246,14 @@ public boolean onOptionsItemSelected(MenuItem item) {
236246
return super.onOptionsItemSelected(item);
237247
}
238248
}
249+
250+
/**
251+
* This method is called when viewPager has reached its end.
252+
* Fetches more images using search query and adds it to the gridView and viewpager adapter
253+
*/
254+
public void requestMoreImages() {
255+
if (categoryImagesListFragment!=null){
256+
categoryImagesListFragment.fetchMoreImagesViewPager();
257+
}
258+
}
239259
}

app/src/main/java/fr/free/nrw/commons/category/CategoryImagesListFragment.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,20 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun
190190
});
191191
}
192192

193+
/**
194+
* This method is called when viewPager has reached its end.
195+
* Fetches more images for the category and adds it to the grid view and viewpager adapter
196+
*/
197+
public void fetchMoreImagesViewPager(){
198+
if (hasMoreImages && !isLoading) {
199+
isLoading = true;
200+
fetchMoreImages();
201+
}
202+
if (!hasMoreImages){
203+
progressBar.setVisibility(GONE);
204+
}
205+
}
206+
193207
/**
194208
* Fetches more images for the category and adds it to the grid view adapter
195209
*/
@@ -228,8 +242,17 @@ private void handleSuccess(List<Media> collection) {
228242
return;
229243
}
230244
gridAdapter.addItems(collection);
245+
try {
246+
((CategoryImagesActivity) getContext()).viewPagerNotifyDataSetChanged();
247+
}catch (Exception e){
248+
e.printStackTrace();
249+
}
250+
try {
251+
((CategoryDetailsActivity) getContext()).viewPagerNotifyDataSetChanged();
252+
}catch (Exception e){
253+
e.printStackTrace();
254+
}
231255
}
232-
233256
progressBar.setVisibility(GONE);
234257
isLoading = false;
235258
statusTextView.setVisibility(GONE);

app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
5353
private FragmentManager supportFragmentManager;
5454
private MediaDetailPagerFragment mediaDetails;
5555
ViewPagerAdapter viewPagerAdapter;
56+
private String query;
5657

5758
@Override
5859
protected void onCreate(Bundle savedInstanceState) {
@@ -104,6 +105,7 @@ public void setTabs() {
104105
.debounce(500, TimeUnit.MILLISECONDS)
105106
.observeOn(AndroidSchedulers.mainThread())
106107
.subscribe( query -> {
108+
this.query = query.toString();
107109
//update image list
108110
if (!TextUtils.isEmpty(query)) {
109111
viewPager.setVisibility(View.VISIBLE);
@@ -145,7 +147,16 @@ public int getTotalMediaCount() {
145147
*/
146148
@Override
147149
public void notifyDatasetChanged() {
150+
}
148151

152+
/**
153+
* This method is called on success of API call for image Search.
154+
* The viewpager will notified that number of items have changed.
155+
*/
156+
public void viewPagerNotifyDataSetChanged() {
157+
if (mediaDetails!=null){
158+
mediaDetails.notifyDataSetChanged();
159+
}
149160
}
150161

151162
/**
@@ -245,4 +256,14 @@ public void updateText(String query) {
245256
// https://stackoverflow.com/questions/6117967/how-to-remove-focus-without-setting-focus-to-another-control/15481511
246257
viewPager.requestFocus();
247258
}
259+
260+
/**
261+
* This method is called when viewPager has reached its end.
262+
* Fetches more images using search query and adds it to the recycler view and viewpager adapter
263+
*/
264+
public void requestMoreImages() {
265+
if (searchImageFragment!=null){
266+
searchImageFragment.addImagesToList(query);
267+
}
268+
}
248269
}

app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import android.view.ViewGroup;
1414
import android.widget.ProgressBar;
1515
import android.widget.TextView;
16+
import android.widget.Toast;
17+
1618
import com.pedrogomez.renderers.RVRendererAdapter;
1719
import java.util.ArrayList;
1820
import java.util.Date;
@@ -160,6 +162,7 @@ private void handlePaginationSuccess(List<Media> mediaList) {
160162
progressBar.setVisibility(View.GONE);
161163
imagesAdapter.addAll(mediaList);
162164
imagesAdapter.notifyDataSetChanged();
165+
((SearchActivity)getContext()).viewPagerNotifyDataSetChanged();
163166
}
164167

165168

@@ -179,6 +182,7 @@ private void handleSuccess(List<Media> mediaList) {
179182
progressBar.setVisibility(View.GONE);
180183
imagesAdapter.addAll(mediaList);
181184
imagesAdapter.notifyDataSetChanged();
185+
((SearchActivity)getContext()).viewPagerNotifyDataSetChanged();
182186

183187
// check if user is waiting for 5 seconds if yes then save search query to history.
184188
Handler handler = new Handler();
@@ -239,7 +243,7 @@ public Media getImageAtPosition(int i) {
239243
return null;
240244
}
241245
else {
242-
return new Media(imagesAdapter.getItem(i).getFilename());
246+
return imagesAdapter.getItem(i);
243247
}
244248
}
245249
}

app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@
3535
import fr.free.nrw.commons.Media;
3636
import fr.free.nrw.commons.R;
3737
import fr.free.nrw.commons.auth.SessionManager;
38+
import fr.free.nrw.commons.category.CategoryDetailsActivity;
39+
import fr.free.nrw.commons.category.CategoryImagesActivity;
3840
import fr.free.nrw.commons.contributions.Contribution;
3941
import fr.free.nrw.commons.contributions.ContributionsActivity;
4042
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
43+
import fr.free.nrw.commons.explore.SearchActivity;
4144
import fr.free.nrw.commons.mwapi.MediaWikiApi;
4245
import fr.free.nrw.commons.utils.ImageUtils;
4346
import timber.log.Timber;
@@ -62,6 +65,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
6265
ViewPager pager;
6366
private Boolean editable;
6467
private boolean isFeaturedImage;
68+
MediaDetailAdapter adapter;
6569

6670
public MediaDetailPagerFragment() {
6771
this(false, false);
@@ -81,7 +85,7 @@ public View onCreateView(LayoutInflater inflater,
8185
ButterKnife.bind(this,view);
8286
pager.addOnPageChangeListener(this);
8387

84-
final MediaDetailAdapter adapter = new MediaDetailAdapter(getChildFragmentManager());
88+
adapter = new MediaDetailAdapter(getChildFragmentManager());
8589

8690
if (savedInstanceState != null) {
8791
final int pageNumber = savedInstanceState.getInt("current-page");
@@ -269,11 +273,35 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
269273

270274
public void showImage(int i) {
271275
Handler handler = new Handler();
272-
handler.postDelayed(() -> pager.setCurrentItem(i), 10);
276+
handler.postDelayed(() -> pager.setCurrentItem(i), 5);
277+
}
278+
279+
/**
280+
* The method notify the viewpager that number of items have changed.
281+
*/
282+
public void notifyDataSetChanged(){
283+
adapter.notifyDataSetChanged();
273284
}
274285

275286
@Override
276287
public void onPageScrolled(int i, float v, int i2) {
288+
if (i+1 >= adapter.getCount()){
289+
try{
290+
((CategoryImagesActivity) getContext()).requestMoreImages();
291+
}catch (Exception e){
292+
e.printStackTrace();
293+
}
294+
try{
295+
((CategoryDetailsActivity) getContext()).requestMoreImages();
296+
}catch (Exception e){
297+
e.printStackTrace();
298+
}
299+
try{
300+
((SearchActivity) getContext()).requestMoreImages();
301+
}catch (Exception e){
302+
e.printStackTrace();
303+
}
304+
}
277305
getActivity().supportInvalidateOptionsMenu();
278306
}
279307

0 commit comments

Comments
 (0)