From c83ad0afc3c7f9503e9e59f5f2fc47a6bcd1cf04 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Tue, 23 Feb 2016 23:24:47 +0100 Subject: [PATCH] Do not load directory again if already loading Fixes crash if user quickly taps on two different directories, where loading directories take a while, like Dropbox or any other network source. Fixes #73 --- .../filepicker/AbstractFilePickerFragment.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/com/nononsenseapps/filepicker/AbstractFilePickerFragment.java b/library/src/main/java/com/nononsenseapps/filepicker/AbstractFilePickerFragment.java index 9b38aec..6fac559 100644 --- a/library/src/main/java/com/nononsenseapps/filepicker/AbstractFilePickerFragment.java +++ b/library/src/main/java/com/nononsenseapps/filepicker/AbstractFilePickerFragment.java @@ -71,6 +71,8 @@ public abstract class AbstractFilePickerFragment extends Fragment protected TextView mCurrentDirView; protected SortedList mFiles = null; protected Toast mToast = null; + // Keep track if we are currently loading a directory, in case it takes a long time + protected boolean isLoading = false; /** * Mandatory empty constructor for the fragment manager to instantiate the @@ -366,6 +368,7 @@ public abstract class AbstractFilePickerFragment extends Fragment */ protected void refresh() { if (hasPermission()) { + isLoading = true; getLoaderManager() .restartLoader(0, null, AbstractFilePickerFragment.this); } else { @@ -414,6 +417,7 @@ public abstract class AbstractFilePickerFragment extends Fragment @Override public void onLoadFinished(final Loader> loader, final SortedList data) { + isLoading = false; mCheckedItems.clear(); mCheckedVisibleViewHolders.clear(); mFiles = data; @@ -432,6 +436,7 @@ public abstract class AbstractFilePickerFragment extends Fragment */ @Override public void onLoaderReset(final Loader> loader) { + isLoading = false; mAdapter.setList(null); mFiles = null; } @@ -551,17 +556,20 @@ public abstract class AbstractFilePickerFragment extends Fragment /** * Browses to the designated directory. It is up to the caller verify that the argument is - * in fact a directory. + * in fact a directory. If another directory is in the process of being loaded, this method + * will not start another load. *

* Currently selected items are cleared by this operation. * * @param file representing the target directory. */ public void goToDir(@NonNull T file) { - mCurrentPath = file; - mCheckedItems.clear(); - mCheckedVisibleViewHolders.clear(); - refresh(); + if (!isLoading) { + mCurrentPath = file; + mCheckedItems.clear(); + mCheckedVisibleViewHolders.clear(); + refresh(); + } } /**