diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/org/madore/android/unicodeMap/UnicodeMapActivity.java | 85 |
1 files changed, 53 insertions, 32 deletions
diff --git a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java index 74dca91..a13f73a 100644 --- a/src/org/madore/android/unicodeMap/UnicodeMapActivity.java +++ b/src/org/madore/android/unicodeMap/UnicodeMapActivity.java @@ -27,15 +27,20 @@ public final class UnicodeMapActivity extends ListActivity { protected UnicodeDatabase db; - protected final List<UnicodeDisplayable> rootList - = new ArrayList<UnicodeDisplayable>(200); + protected class ViewHistory { + public final UnicodeArrayAdapter adapter; + public final int selPosition; + public final int yOffset; + public ViewHistory(UnicodeArrayAdapter adapter, + int selPosition, int yOffset) { + this.adapter = adapter; + this.selPosition = selPosition; + this.yOffset = yOffset; + } + } - protected final List<UnicodeArrayAdapter> stack - = new ArrayList<UnicodeArrayAdapter>(10); - protected final List<Integer> positionStack - = new ArrayList<Integer>(10); - protected final List<Integer> positionYStack - = new ArrayList<Integer>(10); + protected final List<ViewHistory> historyStack + = new ArrayList<ViewHistory>(10); EditText textForm; @@ -67,6 +72,37 @@ public final class UnicodeMapActivity extends ListActivity { thr.start(); } + protected void saveView(View selView, int selPosition) { + final ListView lv = getListView(); + lv.clearTextFilter(); + final UnicodeArrayAdapter adapter + = (UnicodeArrayAdapter) lv.getAdapter(); + final int yOffset; + if ( selView != null ) + yOffset = selView.getTop(); + else + yOffset = 0; + historyStack.add(new ViewHistory(adapter, selPosition, yOffset)); + } + + protected void saveView() { + final ListView lv = getListView(); + lv.clearTextFilter(); + final UnicodeArrayAdapter adapter + = (UnicodeArrayAdapter) lv.getAdapter(); + int position = lv.getSelectedItemPosition(); + int position0 = lv.getFirstVisiblePosition(); + if ( position == AdapterView.INVALID_POSITION ) + position = position0; + View view = lv.getChildAt(position-position0); + final int yOffset; + if ( view != null ) + yOffset = view.getTop(); + else + yOffset = 0; + historyStack.add(new ViewHistory(adapter, position, yOffset)); + } + protected class MapItemClickListener implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { @@ -86,12 +122,7 @@ public final class UnicodeMapActivity extends ListActivity { UnicodeArrayAdapter adapter = new UnicodeArrayAdapter(UnicodeMapActivity.this, list); - stack.add(adapter); - positionStack.add(position); - if ( view != null ) - positionYStack.add(view.getTop()); - else - positionYStack.add(0); + saveView(view, position); setListAdapter(adapter); } else throw new AssertionError("unknown UnicodeDisplayable"); @@ -159,11 +190,12 @@ public final class UnicodeMapActivity extends ListActivity { final boolean needPopulate = db.needPopulate(); if ( needPopulate ) launchPopulation(); + List<UnicodeDisplayable> rootList + = new ArrayList<UnicodeDisplayable>(UnicodeCharacter.Range.values().length); for ( UnicodeCharacter.Range rng : UnicodeCharacter.Range.values() ) rootList.add(rng); UnicodeArrayAdapter rootAdapter = new UnicodeArrayAdapter(this, rootList); - stack.add(rootAdapter); setListAdapter(rootAdapter); final ClipboardManager cmgr = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); @@ -197,18 +229,7 @@ public final class UnicodeMapActivity extends ListActivity { UnicodeArrayAdapter adapter = new UnicodeArrayAdapter(UnicodeMapActivity.this, list); - stack.add(adapter); - final ListView lv = getListView(); - int position = lv.getSelectedItemPosition(); - int position0 = lv.getFirstVisiblePosition(); - if ( position == AdapterView.INVALID_POSITION ) - position = position0; - positionStack.add(position); - View view = lv.getChildAt(position-position0); - if ( view != null ) - positionYStack.add(view.getTop()); - else - positionYStack.add(0); + saveView(); setListAdapter(adapter); if ( overflowed ) { String str = getResources().getString(R.string.list_too_long); @@ -258,12 +279,12 @@ public final class UnicodeMapActivity extends ListActivity { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - if ( ( keyCode == KeyEvent.KEYCODE_BACK ) && stack.size() > 1 ) { + if ( ( keyCode == KeyEvent.KEYCODE_BACK ) + && historyStack.size() > 0 ) { final ListView lv = getListView(); - stack.remove(stack.size()-1); - setListAdapter(stack.get(stack.size()-1)); - lv.setSelectionFromTop(positionStack.remove(positionStack.size()-1), - positionYStack.remove(positionYStack.size()-1)); + ViewHistory saved = historyStack.remove(historyStack.size()-1); + setListAdapter(saved.adapter); + lv.setSelectionFromTop(saved.selPosition, saved.yOffset); return true; } else if ( keyCode == KeyEvent.KEYCODE_SEARCH ) { querySearch(); |