Crash fixed due to notifyDataSetChange

This commit is contained in:
Ujjwal Agrawal 2018-08-08 03:37:48 +05:30
parent c93bcda6f6
commit ecebe4c584
6 changed files with 120 additions and 4 deletions

View file

@ -250,4 +250,24 @@ public class CategoryDetailsActivity extends NavigationBaseActivity
} }
super.onBackPressed(); super.onBackPressed();
} }
/**
* This method is called on success of API call for Images inside a category.
* The viewpager will notified that number of items have changed.
*/
public void viewPagerNotifyDataSetChanged() {
if (mediaDetails!=null){
mediaDetails.notifyDataSetChanged();
}
}
/**
* This method is called when viewPager has reached its end.
* Fetches more images using search query and adds it to the grid view and viewpager adapter
*/
public void requestMoreImages() {
if (categoryImagesListFragment!=null){
categoryImagesListFragment.fetchMoreImagesViewPager();
}
}
} }

View file

@ -170,6 +170,16 @@ public class CategoryImagesActivity
} }
} }
/**
* This method is called on success of API call for featured Images.
* The viewpager will notified that number of items have changed.
*/
public void viewPagerNotifyDataSetChanged() {
if (mediaDetails!=null){
mediaDetails.notifyDataSetChanged();
}
}
/** /**
* This method is called on from getCount of MediaDetailPagerFragment * This method is called on from getCount of MediaDetailPagerFragment
* The viewpager will contain same number of media items as that of media elements in adapter. * The viewpager will contain same number of media items as that of media elements in adapter.
@ -236,4 +246,14 @@ public class CategoryImagesActivity
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }
/**
* This method is called when viewPager has reached its end.
* Fetches more images using search query and adds it to the gridView and viewpager adapter
*/
public void requestMoreImages() {
if (categoryImagesListFragment!=null){
categoryImagesListFragment.fetchMoreImagesViewPager();
}
}
} }

View file

@ -190,6 +190,20 @@ public class CategoryImagesListFragment extends DaggerFragment {
}); });
} }
/**
* This method is called when viewPager has reached its end.
* Fetches more images for the category and adds it to the grid view and viewpager adapter
*/
public void fetchMoreImagesViewPager(){
if (hasMoreImages && !isLoading) {
isLoading = true;
fetchMoreImages();
}
if (!hasMoreImages){
progressBar.setVisibility(GONE);
}
}
/** /**
* Fetches more images for the category and adds it to the grid view adapter * Fetches more images for the category and adds it to the grid view adapter
*/ */
@ -228,8 +242,17 @@ public class CategoryImagesListFragment extends DaggerFragment {
return; return;
} }
gridAdapter.addItems(collection); gridAdapter.addItems(collection);
try {
((CategoryImagesActivity) getContext()).viewPagerNotifyDataSetChanged();
}catch (Exception e){
e.printStackTrace();
}
try {
((CategoryDetailsActivity) getContext()).viewPagerNotifyDataSetChanged();
}catch (Exception e){
e.printStackTrace();
}
} }
progressBar.setVisibility(GONE); progressBar.setVisibility(GONE);
isLoading = false; isLoading = false;
statusTextView.setVisibility(GONE); statusTextView.setVisibility(GONE);

View file

@ -53,6 +53,7 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
private FragmentManager supportFragmentManager; private FragmentManager supportFragmentManager;
private MediaDetailPagerFragment mediaDetails; private MediaDetailPagerFragment mediaDetails;
ViewPagerAdapter viewPagerAdapter; ViewPagerAdapter viewPagerAdapter;
private String query;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -104,6 +105,7 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
.debounce(500, TimeUnit.MILLISECONDS) .debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( query -> { .subscribe( query -> {
this.query = query.toString();
//update image list //update image list
if (!TextUtils.isEmpty(query)) { if (!TextUtils.isEmpty(query)) {
viewPager.setVisibility(View.VISIBLE); viewPager.setVisibility(View.VISIBLE);
@ -145,7 +147,16 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
*/ */
@Override @Override
public void notifyDatasetChanged() { public void notifyDatasetChanged() {
}
/**
* This method is called on success of API call for image Search.
* The viewpager will notified that number of items have changed.
*/
public void viewPagerNotifyDataSetChanged() {
if (mediaDetails!=null){
mediaDetails.notifyDataSetChanged();
}
} }
/** /**
@ -245,4 +256,14 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
// https://stackoverflow.com/questions/6117967/how-to-remove-focus-without-setting-focus-to-another-control/15481511 // https://stackoverflow.com/questions/6117967/how-to-remove-focus-without-setting-focus-to-another-control/15481511
viewPager.requestFocus(); viewPager.requestFocus();
} }
/**
* This method is called when viewPager has reached its end.
* Fetches more images using search query and adds it to the recycler view and viewpager adapter
*/
public void requestMoreImages() {
if (searchImageFragment!=null){
searchImageFragment.addImagesToList(query);
}
}
} }

View file

@ -13,6 +13,8 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.pedrogomez.renderers.RVRendererAdapter; import com.pedrogomez.renderers.RVRendererAdapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
@ -160,6 +162,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
progressBar.setVisibility(View.GONE); progressBar.setVisibility(View.GONE);
imagesAdapter.addAll(mediaList); imagesAdapter.addAll(mediaList);
imagesAdapter.notifyDataSetChanged(); imagesAdapter.notifyDataSetChanged();
((SearchActivity)getContext()).viewPagerNotifyDataSetChanged();
} }
@ -179,6 +182,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
progressBar.setVisibility(View.GONE); progressBar.setVisibility(View.GONE);
imagesAdapter.addAll(mediaList); imagesAdapter.addAll(mediaList);
imagesAdapter.notifyDataSetChanged(); imagesAdapter.notifyDataSetChanged();
((SearchActivity)getContext()).viewPagerNotifyDataSetChanged();
// check if user is waiting for 5 seconds if yes then save search query to history. // check if user is waiting for 5 seconds if yes then save search query to history.
Handler handler = new Handler(); Handler handler = new Handler();
@ -239,7 +243,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
return null; return null;
} }
else { else {
return new Media(imagesAdapter.getItem(i).getFilename()); return imagesAdapter.getItem(i);
} }
} }
} }

View file

@ -35,9 +35,12 @@ import javax.inject.Named;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.category.CategoryDetailsActivity;
import fr.free.nrw.commons.category.CategoryImagesActivity;
import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.explore.SearchActivity;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.utils.ImageUtils;
import timber.log.Timber; import timber.log.Timber;
@ -62,6 +65,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
ViewPager pager; ViewPager pager;
private Boolean editable; private Boolean editable;
private boolean isFeaturedImage; private boolean isFeaturedImage;
MediaDetailAdapter adapter;
public MediaDetailPagerFragment() { public MediaDetailPagerFragment() {
this(false, false); this(false, false);
@ -81,7 +85,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
ButterKnife.bind(this,view); ButterKnife.bind(this,view);
pager.addOnPageChangeListener(this); pager.addOnPageChangeListener(this);
final MediaDetailAdapter adapter = new MediaDetailAdapter(getChildFragmentManager()); adapter = new MediaDetailAdapter(getChildFragmentManager());
if (savedInstanceState != null) { if (savedInstanceState != null) {
final int pageNumber = savedInstanceState.getInt("current-page"); final int pageNumber = savedInstanceState.getInt("current-page");
@ -269,11 +273,35 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
public void showImage(int i) { public void showImage(int i) {
Handler handler = new Handler(); Handler handler = new Handler();
handler.postDelayed(() -> pager.setCurrentItem(i), 10); handler.postDelayed(() -> pager.setCurrentItem(i), 5);
}
/**
* The method notify the viewpager that number of items have changed.
*/
public void notifyDataSetChanged(){
adapter.notifyDataSetChanged();
} }
@Override @Override
public void onPageScrolled(int i, float v, int i2) { public void onPageScrolled(int i, float v, int i2) {
if (i+1 >= adapter.getCount()){
try{
((CategoryImagesActivity) getContext()).requestMoreImages();
}catch (Exception e){
e.printStackTrace();
}
try{
((CategoryDetailsActivity) getContext()).requestMoreImages();
}catch (Exception e){
e.printStackTrace();
}
try{
((SearchActivity) getContext()).requestMoreImages();
}catch (Exception e){
e.printStackTrace();
}
}
getActivity().supportInvalidateOptionsMenu(); getActivity().supportInvalidateOptionsMenu();
} }