remember scrolling position in filechooser

This commit is contained in:
Adrian Ulrich 2014-08-24 18:11:34 +02:00
parent 7b0307653f
commit 46e0470100

View File

@ -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<String, Integer> {
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;
}
}
}