diff --git a/src/ch/blinkenlights/android/vanilla/LibraryPagerAdapter.java b/src/ch/blinkenlights/android/vanilla/LibraryPagerAdapter.java index aba5407d..eb7da30e 100644 --- a/src/ch/blinkenlights/android/vanilla/LibraryPagerAdapter.java +++ b/src/ch/blinkenlights/android/vanilla/LibraryPagerAdapter.java @@ -39,6 +39,7 @@ import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.util.LruCache; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; @@ -115,6 +116,10 @@ public class LibraryPagerAdapter * The file adapter instance, also stored at mAdapters[MediaUtils.TYPE_FILE]. */ private FileSystemAdapter mFilesAdapter; + /** + * LRU cache holding the last scrolling position of the filesadapter listview + */ + private FilePositionLruCache mFilePosLRU; /** * The adapter of the currently visible list. */ @@ -200,6 +205,7 @@ public class LibraryPagerAdapter */ public LibraryPagerAdapter(LibraryActivity activity, Looper workerLooper) { + mFilePosLRU = new FilePositionLruCache(32); mActivity = activity; mUiHandler = new Handler(this); mWorkerHandler = new Handler(workerLooper, this); @@ -549,6 +555,10 @@ public class LibraryPagerAdapter if (mFilesAdapter == null) { mPendingFileLimiter = limiter; } else { + Limiter oldLimiter = mFilesAdapter.getLimiter(); + int curPos = mLists[limiter.type].getFirstVisiblePosition(); + mFilePosLRU.putLimiter(oldLimiter, curPos); + mFilesAdapter.setLimiter(limiter); requestRequery(mFilesAdapter); } @@ -620,6 +630,14 @@ public class LibraryPagerAdapter pos = mSavedPositions[index]; mSavedPositions[index] = 0; } + + if (index == MediaUtils.TYPE_FILE) { + Limiter curLimiter = mAdapters[index].getLimiter(); + Integer curPos = mFilePosLRU.getLimiter(curLimiter); + if (curPos != null) + pos = (int)curPos; + } + mLists[index].setSelection(pos); break; } @@ -812,4 +830,34 @@ public class LibraryPagerAdapter mActivity.onItemClicked(intent); } + + /** + * LRU implementation for filebrowser position cache + */ + private class FilePositionLruCache extends LruCache { + public FilePositionLruCache(int size) { + super(size); + } + public void putLimiter(Limiter limiter, Integer val) { + this.put(_k(limiter), val); + } + public Integer getLimiter(Limiter limiter) { + return this.get(_k(limiter)); + } + + /** + * Stringify limiter or return / if null + */ + private String _k(Limiter limiter) { + String result = "/"; + if (limiter != null) { + for(String entry : limiter.names) { + result = result + entry + "/"; + } + } + return result; + } + + } + }