@@ -89,7 +89,7 @@ public class GsFileBrowserListAdapter extends RecyclerView.Adapter<GsFileBrowser
8989 private File _fileToShowAfterNextLoad ;
9090 private File _currentFolder ;
9191 private final Context _context ;
92- private StringFilter _filter ;
92+ private final StringFilter _filter ;
9393 private RecyclerView _recyclerView ;
9494 private LinearLayoutManager _layoutManager ;
9595 private final Map <File , File > _virtualMapping ;
@@ -139,6 +139,7 @@ public GsFileBrowserListAdapter(GsFileBrowserOptions.Options options, Context co
139139 _virtualMapping = Collections .unmodifiableMap (getVirtualFolders ());
140140 _reverseVirtualMapping = Collections .unmodifiableMap (GsCollectionUtils .reverse (_virtualMapping ));
141141 loadFolder (_dopt .startFolder != null ? _dopt .startFolder : _dopt .rootFolder , null );
142+ _filter = new StringFilter (this );
142143 }
143144
144145 public Map <File , File > getVirtualFolders () {
@@ -367,9 +368,6 @@ public int getItemCount() {
367368
368369 @ Override
369370 public Filter getFilter () {
370- if (_filter == null ) {
371- _filter = new StringFilter (this , _adapterData );
372- }
373371 return _filter ;
374372 }
375373
@@ -600,7 +598,7 @@ public void showFile(final File file) {
600598 return ;
601599 }
602600
603- if (getFilePosition (file ) < 0 ) {
601+ if (! _adapterDataFiltered . contains (file )) {
604602 final File dir = file .getParentFile ();
605603 if (dir != null ) {
606604 loadFolder (dir , file );
@@ -620,13 +618,19 @@ public void onLayoutChange(View v, int l, int t, int r, int b, int ol, int ot, i
620618 });
621619 }
622620
621+ private void postScrollToAndFlash (final File file ) {
622+ if (_recyclerView != null && file != null ) {
623+ _recyclerView .post (() -> scrollToAndFlash (file ));
624+ }
625+ }
626+
623627 /**
624628 * Scroll to a file in current folder and flash
625629 *
626630 * @param file File to blink
627631 */
628632 public boolean scrollToAndFlash (final File file ) {
629- final int pos = getFilePosition (file );
633+ final int pos = _adapterDataFiltered . indexOf (file );
630634 if (pos >= 0 && _layoutManager != null ) {
631635 _layoutManager .scrollToPosition (pos );
632636 _recyclerView .post (() ->
@@ -641,19 +645,6 @@ public boolean scrollToAndFlash(final File file) {
641645 return false ;
642646 }
643647
644- // Get the position of a file in the current view
645- // -1 if file is not a child of the current directory
646- public int getFilePosition (final File file ) {
647- if (file != null ) {
648- for (int i = 0 ; i < _adapterDataFiltered .size (); i ++) {
649- if (_adapterDataFiltered .get (i ).equals (file )) {
650- return i ;
651- }
652- }
653- }
654- return -1 ;
655- }
656-
657648 private static final ExecutorService executorService = new ThreadPoolExecutor (0 , 3 , 60 , TimeUnit .SECONDS , new SynchronousQueue <>());
658649
659650 private void loadFolder (final File folder , final File show ) {
@@ -696,6 +687,11 @@ private void loadFolder(final File folder, final File show) {
696687
697688 // This function is not called on the main thread, so post to the UI thread
698689 private synchronized void _loadFolder (final @ NonNull File folder , final @ Nullable File toShow ) {
690+
691+ if (_recyclerView == null ) {
692+ return ;
693+ }
694+
699695 final boolean folderChanged = !folder .equals (_currentFolder );
700696 final List <File > newData = new ArrayList <>();
701697
@@ -717,7 +713,6 @@ private synchronized void _loadFolder(final @NonNull File folder, final @Nullabl
717713 newData .add (new File (folder , "0" ));
718714 }
719715
720-
721716 if (folder .equals (VIRTUAL_STORAGE_RECENTS )) {
722717 newData .addAll (_dopt .recentFiles );
723718 } else if (folder .equals (VIRTUAL_STORAGE_POPULAR )) {
@@ -756,16 +751,17 @@ private synchronized void _loadFolder(final @NonNull File folder, final @Nullabl
756751 }
757752 }
758753
759- if (_recyclerView == null ) {
760- //noinspection UnnecessaryReturnStatement
761- return ;
762- } else if ( folderChanged || modSumChanged || ! newData . equals ( _adapterData )) {
754+ if (folderChanged || modSumChanged || ! newData . equals ( _adapterData ) ) {
755+ final ArrayList < File > filteredData = new ArrayList <>();
756+ _filter . _filter ( newData , filteredData ) ;
757+
763758 _recyclerView .post (() -> {
764759 // Modify all these values in the UI thread
765760 _adapterData .clear ();
766761 _adapterData .addAll (newData );
762+ _adapterDataFiltered .clear ();
763+ _adapterDataFiltered .addAll (filteredData );
767764 _currentSelection .retainAll (_adapterData );
768- _filter .filter (_filter ._lastFilter );
769765 _currentFolder = folder ;
770766 _prevModSum = modSum ;
771767
@@ -782,18 +778,18 @@ private synchronized void _loadFolder(final @NonNull File folder, final @Nullabl
782778 _layoutManager .onRestoreInstanceState (_folderScrollMap .remove (_currentFolder ));
783779 }
784780
785- _recyclerView . post (() -> scrollToAndFlash ( toShow ) );
781+ postScrollToAndFlash ( toShow );
786782 });
787- } else if ( toShow != null && _adapterDataFiltered . contains ( toShow )) {
788- _recyclerView . post (() -> scrollToAndFlash ( toShow ) );
783+ } else {
784+ postScrollToAndFlash ( toShow );
789785 }
790786
791787 if (_dopt .listener != null ) {
792788 _dopt .listener .onFsViewerDoUiUpdate (GsFileBrowserListAdapter .this );
793789 }
794790 });
795- } else if ( toShow != null && _adapterDataFiltered . contains ( toShow )) {
796- _recyclerView . post (() -> scrollToAndFlash ( toShow ) );
791+ } else {
792+ postScrollToAndFlash ( toShow );
797793 }
798794 }
799795
@@ -835,39 +831,40 @@ public boolean isCurrentFolderHome() {
835831 //########################
836832 private static class StringFilter extends Filter {
837833 private final GsFileBrowserListAdapter _adapter ;
838- private final List <File > _originalList ;
839834 private final List <File > _filteredList ;
840- public CharSequence _lastFilter = "" ;
835+ public String _lastFilter = "" ;
841836
842- private StringFilter (GsFileBrowserListAdapter adapter , List < File > adapterData ) {
837+ private StringFilter (final GsFileBrowserListAdapter adapter ) {
843838 super ();
844839 _adapter = adapter ;
845- _originalList = adapterData ;
846840 _filteredList = new ArrayList <>();
847841 }
848842
849843 @ Override
850844 protected FilterResults performFiltering (CharSequence constraint ) {
851845 final FilterResults results = new FilterResults ();
852- constraint = constraint .toString ().toLowerCase (Locale .getDefault ()).trim ();
853- _filteredList .clear ();
854846
855- if (constraint .length () == 0 ) {
856- _filteredList .addAll (_originalList );
857- } else {
858- for (File file : _originalList ) {
859- if (file .getName ().toLowerCase (Locale .getDefault ()).contains (constraint )) {
860- _filteredList .add (file );
861- }
862- }
863- }
847+ _lastFilter = constraint .toString ().toLowerCase ().trim ();
848+ _filter (_adapter ._adapterData , _filteredList );
864849
865- _lastFilter = constraint ;
866850 results .values = _filteredList ;
867851 results .count = _filteredList .size ();
868852 return results ;
869853 }
870854
855+ public void _filter (final List <File > all , final List <File > filtered ) {
856+ filtered .clear ();
857+ if (_lastFilter .isEmpty ()) {
858+ filtered .addAll (all );
859+ } else {
860+ for (final File file : all ) {
861+ if (file .getName ().toLowerCase ().contains (_lastFilter )) {
862+ filtered .add (file );
863+ }
864+ }
865+ }
866+ }
867+
871868 @ Override
872869 @ SuppressWarnings ("unchecked" )
873870 protected void publishResults (CharSequence constraint , FilterResults results ) {
0 commit comments