diff options
| author | Leon Scroggins <scroggo@google.com> | 2009-05-13 15:58:03 -0400 |
|---|---|---|
| committer | Leon Scroggins <scroggo@google.com> | 2009-05-13 15:58:03 -0400 |
| commit | 3667ce4caeb83c4746b5366a882db671b4faca19 (patch) | |
| tree | 59f191814d735939ab1007884002f0c4b0f6e52b /core/java/android | |
| parent | a2a34a5711bde03475b40edfe3cc052ece02700a (diff) | |
| download | frameworks_base-3667ce4caeb83c4746b5366a882db671b4faca19.zip frameworks_base-3667ce4caeb83c4746b5366a882db671b4faca19.tar.gz frameworks_base-3667ce4caeb83c4746b5366a882db671b4faca19.tar.bz2 | |
Enable filtering <select> lists.
Fix a bug where the filter text could not be deleted,
and another where filtering changes the checked item,
so that filtering <select> lists can be reenabled.
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/webkit/WebView.java | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index a926355..563d819 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnCancelListener; +import android.database.DataSetObserver; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -60,6 +61,7 @@ import android.view.inputmethod.InputMethodManager; import android.webkit.TextDialog.AutoCompleteAdapter; import android.webkit.WebViewCore.EventHub; import android.widget.AbsoluteLayout; +import android.widget.Adapter; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.FrameLayout; @@ -4809,7 +4811,10 @@ public class WebView extends AbsoluteLayout @Override public boolean hasStableIds() { - return true; + // AdapterView's onChanged method uses this to determine whether + // to restore the old state. Return false so that the old (out + // of date) state does not replace the new, valid state. + return false; } private Container item(int position) { @@ -4873,6 +4878,51 @@ public class WebView extends AbsoluteLayout } } + /* + * Whenever the data set changes due to filtering, this class ensures + * that the checked item remains checked. + */ + private class SingleDataSetObserver extends DataSetObserver { + private long mCheckedId; + private ListView mListView; + private Adapter mAdapter; + + /* + * Create a new observer. + * @param id The ID of the item to keep checked. + * @param l ListView for getting and clearing the checked states + * @param a Adapter for getting the IDs + */ + public SingleDataSetObserver(long id, ListView l, Adapter a) { + mCheckedId = id; + mListView = l; + mAdapter = a; + } + + public void onChanged() { + // The filter may have changed which item is checked. Find the + // item that the ListView thinks is checked. + int position = mListView.getCheckedItemPosition(); + long id = mAdapter.getItemId(position); + if (mCheckedId != id) { + // Clear the ListView's idea of the checked item, since + // it is incorrect + mListView.clearChoices(); + // Search for mCheckedId. If it is in the filtered list, + // mark it as checked + int count = mAdapter.getCount(); + for (int i = 0; i < count; i++) { + if (mAdapter.getItemId(i) == mCheckedId) { + mListView.setItemChecked(i, true); + break; + } + } + } + } + + public void onInvalidate() {} + } + public void run() { final ListView listView = (ListView) LayoutInflater.from(mContext) .inflate(com.android.internal.R.layout.select_dialog, null); @@ -4901,8 +4951,7 @@ public class WebView extends AbsoluteLayout // filtered. Do not allow filtering on multiple lists until // that bug is fixed. - // Disable filter altogether - // listView.setTextFilterEnabled(!mMultiple); + listView.setTextFilterEnabled(!mMultiple); if (mMultiple) { listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); int length = mSelectedArray.length; @@ -4922,6 +4971,9 @@ public class WebView extends AbsoluteLayout listView.setSelection(mSelection); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setItemChecked(mSelection, true); + DataSetObserver observer = new SingleDataSetObserver( + adapter.getItemId(mSelection), listView, adapter); + adapter.registerDataSetObserver(observer); } } dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { |
