Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.64
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
#1

SearchView или своя реализация поиска (UI) - Программирование Android

01.07.2013, 20:24. Просмотров 6762. Ответов 32
Метки нет (Все метки)

Требуется реализовать интерфейс для поиска. В ActionBar имеется SearchView, который отправляет запрос на сервер, после этого приходит ответ, который нужно отобразить в этой-же Activity и дать возможность выбрать нужный.

Основные проблемные моменты это:
-возможность вывести результат только в части экрана под строкой поиска
-закрывать поиск по клику вне зоны поиска и результатов

Пытался реализовать стандартным способом, но там приходится подключать базу данных, добавлять кучу непонятных фич.
Если выводить в обычном ListView, то нет возможности нормально отлавливать клики, попадает или нет в область списка.
PopupWindow не поддается нормальной разметке. Размеры можно указать только в цифрах с неизвестными величинами, в результате на разных экранах выглядит криво. При чем если параметр focusable = true, то блокируются посторонние элементы интерфейса, а если false то не обрабатывается клик по итемам.

Я в ступоре, нужна помощь. Пример моей реализации ниже, нужно что-то подобное
0
Миниатюры
SearchView или своя реализация поиска (UI)  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2013, 20:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос SearchView или своя реализация поиска (UI) (Программирование Android):

Реализация поиска в ActionBar
Здравствуйте. Я пробую сделать поиск в ActionBar-е. Читал много статей, в итоге...

Реализация поиска в приложении
Есть страница на которой можно найти статью, но все статьи находятся на...

SearchView в ActionBar
Всем привет! Добавил в ActionBar фрагмента SearchView, но он не появляется,...

Searchview в toolbar
Доброго времени суток уважаемые форумчане. Нужна Ваша помощь в реализации...

SearchView ругается на Listener?
Добрый день! подскажите что ему не нравится: @Override public boolean...

Отследить закрытие SearchView Android
Подскажите пожалуйста, как отследить закрытие SearchView, производится нажатием...

32
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 21:42 #2
не вижу ничего сложного в стандартном подходе, не нужно никаких баз, нужен только курсор.
вот пример создания и наполнения курсора.
Java
1
2
3
4
5
6
7
8
9
10
    String[] columnNames = {"_id","text"}
    MatrixCursor cursor = new MatrixCursor(columnNames);
    String[] array = Resources.getSystem().getStringArray(R.id.allStrings); //if strings are in resources
    String[] temp = new String[2];
    int id = 0;
    for(String item : array){
        temp[0] = Integer.toString(id++);
        temp[1] = item;
        cursor.addRow(temp);
    }
1
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 21:48  [ТС] #3
Цитата Сообщение от V0v1k Посмотреть сообщение
Кликните здесь для просмотра всего текста
не вижу ничего сложного в стандартном подходе, не нужно никаких баз, нужен только курсор.
вот пример создания и наполнения курсора.
Java
1
2
3
4
5
6
7
8
9
10
    String[] columnNames = {"_id","text"}
    MatrixCursor cursor = new MatrixCursor(columnNames);
    String[] array = Resources.getSystem().getStringArray(R.id.allStrings); //if strings are in resources
    String[] temp = new String[2];
    int id = 0;
    for(String item : array){
        temp[0] = Integer.toString(id++);
        temp[1] = item;
        cursor.addRow(temp);
    }
Как я смогу отображать результаты подобным образом? Мне важен именно тот момент, что бы на заднем фоне была видна активити. Собственно сам поиск работает без проблем, нужно вывести результаты на экран и иметь возможность их скрыть (вместе с SearchView), если пользователь кликнул в другой области
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 21:56 #4
та враде так и работает стандартная реализация через адаптер.
0
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 21:59  [ТС] #5
Цитата Сообщение от V0v1k Посмотреть сообщение
та враде так и работает стандартная реализация через адаптер.
Видимо я чего-то не понимаю. Как мне сделать вывод результатов внизу под поиском? То что на скрине это PopupWindow реализованная мной довольно криво. Я так понимаю что есть возможность переложить вывод на плечи андроида.
http://developer.android.com/intl/ru...ggestions.html по этой ссылке что-то подобное, но реализуемо только через базу данных
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 22:16 #6
в SearchView можно засунуть адаптер setSuggestionsAdapter() который создает этот выпадающий список методом getDropDownView(), если я все правильно понял.

Добавлено через 8 минут
Цитата Сообщение от MonStar Посмотреть сообщение
Если выводить в обычном ListView, то нет возможности нормально отлавливать клики, попадает или нет в область списка.
не понятно.
Цитата Сообщение от MonStar Посмотреть сообщение
PopupWindow не поддается нормальной разметке. Размеры можно указать только в цифрах с неизвестными величинами, в результате на разных экранах выглядит криво.
что за неизвестные величины?
Цитата Сообщение от MonStar Посмотреть сообщение
При чем если параметр focusable = true, то блокируются посторонние элементы интерфейса, а если false то не обрабатывается клик по итемам.
ну правильно, при первом клике за пределами попапа должен просто пропадать попап, а потом уже можно кликать по другим элементам.
0
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 22:30  [ТС] #7
Цитата Сообщение от V0v1k Посмотреть сообщение
в SearchView можно засунуть адаптер setSuggestionsAdapter() который создает этот выпадающий список методом getDropDownView(), если я все правильно понял.
Я не совсем понял, что делать с методом getDropDownView, для чего параметры, которые подаются в него и как вообще он связан с адаптером, что бы я мог отобразить список
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 22:32 #8
вы никогда адаптерами не пользовались?
0
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 22:37  [ТС] #9
Цитата Сообщение от V0v1k Посмотреть сообщение
вы никогда адаптерами не пользовались?
Разумеется пользовался. Я просто не уверен, что вы поняли мою проблему, так как начал описывать свои решения.
Грубо говоря у меня есть готовый список, из 5-10 элементов, который мне нужно отобразить под виджетом поиска в углу экрана. Сам процесс поиска происходит на сервере, а у меня только результат.
Этот кусочек с результатами должен возвращать мне выбранный итем из списка. В случае нажатия на любую другую область он должен закрываться.

Итак у меня есть метод setSuggestionsAdapter, который требует CursorAdapter, что бы создать его мне нужно отдать ему Cursor с данными. Потом вызвать метод getDropDownView() в который передать некую позицию. Тут явно пропущен огромный кусок, в котором кроется моя проблема. Как отобразить дурацкое окошко с результатами.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 22:43 #10
Цитата Сообщение от MonStar Посмотреть сообщение
Тут явно пропущен огромный кусок, в котором кроется моя проблема. Как отобразить дурацкое окошко с результатами.
это окошко по умолчанию реализовано SearchView, оно отображается если есть данные для него
Цитата Сообщение от MonStar Посмотреть сообщение
http://developer.android.com/intl/ru...ggestions.html по этой ссылке что-то подобное, но реализуемо только через базу данных
нет, здесь через Content Provider, в принципе, вам подходит.
1
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 22:47  [ТС] #11
Цитата Сообщение от V0v1k Посмотреть сообщение
это окошко по умолчанию реализовано SearchView, оно отображается если есть данные для него
Вот именно моя проблема в том, как вызвать это окошко.
Способ с ContentProvider мне не подходит, т.к. это много ненужных действий по реализации базы данных, а результаты приходят с сервера после ввода каждой буквы. Это будет огромная куча запросов и начнутся тормоза.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 22:50 #12
Java
1
2
3
4
вот нашел пример кода с адаптером
searchView.setOnQueryTextListener(this);
searchAdapter = new SimpleCursorAdapter(this, R.layout.listentry, null, new String[] { "name" }, new int[] { R.id.name_entry }, 0);
searchView.setSuggestionsAdapter(searchAdapter);
Then, in the onQueryTextChanged method I have this:
Java
1
searchAdapter.changeCursor(cursor);
здесь cursor наполняете данными которые должны отобразится в этом попапе, как наполнять я писал выше.

Добавлено через 55 секунд
Цитата Сообщение от MonStar Посмотреть сообщение
Вот именно моя проблема в том, как вызвать это окошко.
оно автоматически вызывается.
Цитата Сообщение от MonStar Посмотреть сообщение
Способ с ContentProvider мне не подходит, т.к. это много ненужных действий по реализации базы данных, а результаты приходят с сервера после ввода каждой
не нужно там никаких баз данных.
1
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 23:16  [ТС] #13
Цитата Сообщение от V0v1k Посмотреть сообщение
Java
1
2
3
4
вот нашел пример кода с адаптером
searchView.setOnQueryTextListener(this);
searchAdapter = new SimpleCursorAdapter(this, R.layout.listentry, null, new String[] { "name" }, new int[] { R.id.name_entry }, 0);
searchView.setSuggestionsAdapter(searchAdapter);
Then, in the onQueryTextChanged method I have this:
Java
1
searchAdapter.changeCursor(cursor);
здесь cursor наполняете данными которые должны отобразится в этом попапе, как наполнять я писал выше.
Ура, мне удалось вызвать это окошко. Спасибо огромнейшее. Не знаю, что бы я делал без вашего форума и конкретно без вашей поддержки ) Мне удалось решить уже не одну проблему
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 23:26 #14
и вам спасибо, самому скоро это пригодится

Добавлено через 4 минуты
я искал, вы проверяли, совместными усилиями разобрались
0
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 23:33  [ТС] #15
Цитата Сообщение от V0v1k Посмотреть сообщение
и вам спасибо, самому скоро это пригодится

Добавлено через 4 минуты
я искал, вы проверяли, совместными усилиями разобрались
В таком случае еще небольшой вопрос. Как обработать нажатие по FragmentActivity в любой области. Не важно ActionBar или что-то другое, весь экран нужно захватить. Нужно будет закрывать поиск по клику просто.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 23:37 #16
даже не знаю.
а разве он не закрывается? не проверял SearchView но есть пример с AutoCompleteTextView и в нем попап сам прячется при клике за его пределами.
0
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
01.07.2013, 23:39  [ТС] #17
Цитата Сообщение от V0v1k Посмотреть сообщение
даже не знаю.
а разве он не закрывается? не проверял SearchView но есть пример с AutoCompleteTextView и в нем попап сам прячется при клике за его пределами.
Сама строка поиска остается открытой. Прячется только список. Поэтому хочу отдельно обработать клик, что бы закрывать
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.07.2013, 23:53 #18
даже не знаю что посоветовать, не знаю как захватить экшен бар, но все остальное можно перекрыть невидимой View и отлавливать по нему тачи или экстенднуть рутовый лаяут и в нем перехватывать тачи.

кстати, строка поиска прячется при нажатии хардварного бека или бек иконки в экшен баре.
0
MonStar
22 / 22 / 4
Регистрация: 10.04.2011
Сообщений: 241
02.07.2013, 15:42  [ТС] #19
По ходу появился вопрос. Как вывести результаты поиска, как только его открыли. Т.е. что бы не вводя ни одного символа пользователь уже видел результаты.
Так же нужно что бы поиск начинался с первого символа, а у меня результаты выводятся только после второго

Добавлено через 17 минут
И еще. Как получить выбранный элемент из списка
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.07.2013, 15:51 #20
Цитата Сообщение от MonStar Посмотреть сообщение
И еще. Как получить выбранный элемент из списка
setOnSuggestionListener вроде - http://developer.android.com/reference/android/widget/SearchView.html

Добавлено через 48 секунд
Цитата Сообщение от MonStar Посмотреть сообщение
Как вывести результаты поиска, как только его открыли. Т.е. что бы не вводя ни одного символа пользователь уже видел результаты.
Так же нужно что бы поиск начинался с первого символа, а у меня результаты выводятся только после второго
хз, это стандартное поведение. каким может быть результат поиска если юзер ничего не ввел?
0
02.07.2013, 15:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2013, 15:51
Привет! Вот еще темы с решениями:

Передать SearchView из активити во фрагмент
У меня есть SearchView в активити и тесть фрагмент который запускается через...

Поиск в ListView с помощью SearchView
Прикручиваю SearchView, чтобы фильтровать ListView: MenuItem...

Спрятать SearchView в некоторых фрагментах
Всем привет, такой вопрос: Есть NavigationDrawer В одном фрагменте реализован...

Запретить перекрытие SearchView списком от TextView
Уважаемые Форумчане Помогите с решением проблемы с перекрытием SeqrchView...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru