На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Autocomplete для EditText
    Конечно есть возможность один раз создать и много раз использовать http://www.vogella.com/articles/AndroidSQLite/article.html
      Ну уже похоже не в этом необходимости. В доступной мне базе названий улиц и прочих городских объектов все равно все строки в верхнем регистре. Поэтому я просто написал свой TextWatcher, в котором для каждой строки из массива вызывается метод contains() с приведенным к верхнему регистру пользовательским вводом. У меня это очень хорошо стало работать, почти без тормозов (пробовал на телефоне). А у шефа все как и было, но у него телефон мощный. ЕдинственноеЮ что осталось - это в отдельном потоке это все запускать, чтобы не замедлять сам ввод в поле.
        Homez, по собственному опыту тоже сталкивался с тем, что долго тупило при работе с базой и AutoCompleteTextView. В итоге выяснилось, что тормозит именно это заполнение AutoCompleteTextView. В итоге сделал ограничение на 50 записей - всё равно целое полотенце пользователю будет листать неудобно, а если не будет нужного результата, так можно и ещё одну буковку дописать. В итоге всё летает и на эмуляторе, и на довольно слабых девайсах (Motorola Droid, HTC Wildfire).
          Хрен, да тут дело в другом было. Все равно эти 50 записей нужно как-то выбрать из имеющегося обширного массива - 5190 строк, все равно ведь нужно все просматривать. у меня тормозило и при 4ых подходящих вариантах.

          Ну допустим, когда подходит слишком много вариантов, действительно, можно при достижении некоторого порогового количества поиск прекращать. Но а когда подходит из всего массива только четыре - тут уже приходится дочитать до конца. Ну хотя, можно придумать всякие хитрые алгоритмы, например, начальник (он не программист, но порой подсказывает просто гениальные вещи) надумал, что можно при наборе каждой следующей буквы выбирать совпадения только из тех строк, которые подошли на предыдущем шаге. Но тут скорость выборки тогла получится с разбросом - чем меньше букв, тем она будет меньше. Правда, можно показывать варианты, например, начиная с 4ых букв, а пока пользователь их набирает, постепенно сужать массив, в котором поиск будет вестись, просто не выводя эти промежуточные варианты пользователю.

          Но я сейчас вполне доволен скоростью. Подозреваю, что мое устройство одно из самых слабеньких (второе по дешивизне на Яндекс.Маркет для Питера среди Android-смартфонов. А доводить до полного блеска, чтобы летало и на эмуляторе, не вижу смысла, лучше потрачу это время на что-нибудь другое. Однако, на эмуляторе так и не пробовал, попробую завтра.

          Думаю, что внутренняя реализация AutoСomleteTextView не особо удачная и не была задумана для работы с такими большими массивами строк, как список улиц в городе масштаба Санкт-Петербурга. Я для начала пробовал формировать массив для ArrayAdapter с помощью отбора на основе регулярных выражений. И то намного быстрее стало работать. Сколько же лишнего кода там выполняется для подбора вариантов из массива в распоряжении?
            Цитата Homez @
            все равно ведь нужно все просматривать.

            А LIMIT 50 при запросе к базе отменили? ;)
              Ага, и он непременно будет работать, когда в базе 10 000 строк, а критерию удовлетворяют только 2-3:) При этом гарантированно выборка будет идти только по сотне-другой строк:)
                Цитата Homez @
                Ага, и он непременно будет работать, когда в базе 10 000 строк, а критерию удовлетворяют только 2-3:) При этом гарантированно выборка будет идти только по сотне-другой строк

                Причём тут это? Если загвоздка в большой базе, то индексация спасёт отца русской демократии =)
                  Ну так а как тут проиндексировать, когда набранные 3 буквы могут быть в какой угодно строке, если говорить о базе названий улиц большого города, причем интересуют совпадения не только с начала строки названия, но и в любом ее месте?
                    Цитата Homez @
                    Ну так а как тут проиндексировать, когда набранные 3 буквы могут быть в какой угодно строке, если говорить о базе названий улиц большого города, причем интересуют совпадения не только с начала строки названия, но и в любом ее месте?

                    Для этого есть полнотекстовые индексы, SQLite их поддерживает.
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0232 ]   [ 14 queries used ]   [ Generated: 27.07.24, 06:58 GMT ]