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();
}
/**
* 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
* 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);
}
}
/**
* 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
*/
@ -228,8 +242,17 @@ public class CategoryImagesListFragment extends DaggerFragment {
return;
}
gridAdapter.addItems(collection);
try {
((CategoryImagesActivity) getContext()).viewPagerNotifyDataSetChanged();
}catch (Exception e){
e.printStackTrace();
}
try {
((CategoryDetailsActivity) getContext()).viewPagerNotifyDataSetChanged();
}catch (Exception e){
e.printStackTrace();
}
}
progressBar.setVisibility(GONE);
isLoading = false;
statusTextView.setVisibility(GONE);

View file

@ -53,6 +53,7 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
private FragmentManager supportFragmentManager;
private MediaDetailPagerFragment mediaDetails;
ViewPagerAdapter viewPagerAdapter;
private String query;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -104,6 +105,7 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe( query -> {
this.query = query.toString();
//update image list
if (!TextUtils.isEmpty(query)) {
viewPager.setVisibility(View.VISIBLE);
@ -145,7 +147,16 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai
*/
@Override
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
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.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.pedrogomez.renderers.RVRendererAdapter;
import java.util.ArrayList;
import java.util.Date;
@ -160,6 +162,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
progressBar.setVisibility(View.GONE);
imagesAdapter.addAll(mediaList);
imagesAdapter.notifyDataSetChanged();
((SearchActivity)getContext()).viewPagerNotifyDataSetChanged();
}
@ -179,6 +182,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
progressBar.setVisibility(View.GONE);
imagesAdapter.addAll(mediaList);
imagesAdapter.notifyDataSetChanged();
((SearchActivity)getContext()).viewPagerNotifyDataSetChanged();
// check if user is waiting for 5 seconds if yes then save search query to history.
Handler handler = new Handler();
@ -239,7 +243,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
return null;
}
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.R;
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.ContributionsActivity;
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.utils.ImageUtils;
import timber.log.Timber;
@ -62,6 +65,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
ViewPager pager;
private Boolean editable;
private boolean isFeaturedImage;
MediaDetailAdapter adapter;
public MediaDetailPagerFragment() {
this(false, false);
@ -81,7 +85,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
ButterKnife.bind(this,view);
pager.addOnPageChangeListener(this);
final MediaDetailAdapter adapter = new MediaDetailAdapter(getChildFragmentManager());
adapter = new MediaDetailAdapter(getChildFragmentManager());
if (savedInstanceState != null) {
final int pageNumber = savedInstanceState.getInt("current-page");
@ -269,11 +273,35 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
public void showImage(int i) {
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
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();
}