Как создать поиск?

Ответить
Petrik
Сообщения: 18
Зарегистрирован: 12 фев 2015, 18:10

Как создать поиск?

Сообщение Petrik » 18 фев 2015, 16:59

Здравствуйте, подскажите пожалуйста как можно организовать поиск в приложении? Пользователь вводит текст, и если он есть (я так понял в файлах ресурсах, иди БД нужно создавать?) то он (результат поиска) выводится на экран.
Можно пожалуйста поподробней, что куда прописать, а то я нуб.

Аватара пользователя
rsdev
Сообщения: 22
Зарегистрирован: 11 фев 2015, 13:11

Re: Как создать поиск?

Сообщение rsdev » 19 фев 2015, 07:43

Добрый день.
Большие специалисты не любят такие вопросы, слишком мало конкретики, поэтому вот вам ответ от новичка.
Уточните, какую информацию и где требуется искать в приложении?
Полный ответ можно найти, посмотрев уроки.
Для начала нужно создать данные ресурсы: БД, текстовый файл, или массив в проекте.
Поместить в Activity компоненты EditText и Button
По клику на Button уже производить поиск по нужному ресурсу и сообщать пользователю ответ.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как создать поиск?

Сообщение altwin » 19 фев 2015, 09:48

По подробней конечно можно, но для начала вам придется познакомится с основами информационного поиска, чтобы мы могли говорить на одном языке. Учитывая предмет, минимум это :
1. http://market.yandex.ua/product/6423381
2. http://market.yandex.ua/product/7622447 ... 1%82%D0%B0
Изображение

Petrik
Сообщения: 18
Зарегистрирован: 12 фев 2015, 18:10

Re: Как создать поиск?

Сообщение Petrik » 19 фев 2015, 19:44

rsdev писал(а):Уточните, какую информацию и где требуется искать в приложении?
Требуется искать только текст. А куда лучше поместить не знаю. Например, пользователь вводит текст: "Первая мировая война нача", а приложение показывает: "Первая мировая война началась 28 июля 1914 года".

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Как создать поиск?

Сообщение doter.ua » 19 фев 2015, 21:51

Petrik писал(а):
rsdev писал(а):Уточните, какую информацию и где требуется искать в приложении?
Требуется искать только текст. А куда лучше поместить не знаю. Например, пользователь вводит текст: "Первая мировая война нача", а приложение показывает: "Первая мировая война началась 28 июля 1914 года".
Если речь про поиске среди того, что есть в приложении (например статья с заголовком "Первая мировая война началась 28 июля 1914 года" ), то делается это относительно просто, а если инфа должна браться из "воздуха" - можете смело бросать свою затею.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Petrik
Сообщения: 18
Зарегистрирован: 12 фев 2015, 18:10

Re: Как создать поиск?

Сообщение Petrik » 19 фев 2015, 22:04

Да, что есть в приложении. Куда можно поместить текст, что б потом пользователь мог его найти (да же если вводил бы не полный текст, а его фрагмент)?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Как создать поиск?

Сообщение doter.ua » 19 фев 2015, 22:18

Petrik писал(а):Да, что есть в приложении. Куда можно поместить текст, что б потом пользователь мог его найти (да же если вводил бы не полный текст, а его фрагмент)?
Смотря где инфа хранится.
Допустим юзер вводит текст в EditText, ему нужно написать TextWatcher

Код: Выделить всё

et1.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub
                if( s.toString() не empty ){
                 // Тут фильтруем и собираем результаты  ( смотри пункт 1 или 2 )
                } 
            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
            }
        });
1) Если в БД то можно в запросе фильтровать ( гугли оператор select + LIKE, так же суть символа процента "%" в LIKE )
2) Если в стринге то можно встроенным методом

Код: Выделить всё

String str = "раз два три Иван четыре пять";
if( str.contains("три Ив") )
(подробнее гугли регулярные выражения)
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Petrik
Сообщения: 18
Зарегистрирован: 12 фев 2015, 18:10

Re: Как создать поиск?

Сообщение Petrik » 02 мар 2015, 18:53

Информация хранится в массиве строк. Создавал в лэйауте EditText и ListView

[syntax=java]final ListView lvSearch = (ListView) findViewById(R.id.lvSearch);
inputSearch = (EditText) findViewById(R.id.inputSearch);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.spisok,
R.layout.text_list_item);

lvSearch.setAdapter(adapter);

inputSearch.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
SearchableActivity.this.adapter.getFilter().filter(cs);
}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub

}

@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});

}[/syntax]

Но как только вводишь первый символ появляется ошибка.

[syntax=java5]03-02 21:48:50.692 9590-9590/com.sait.android E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at com.sait.android.SearchableActivity$1.onTextChanged(SearchableActivity.java:55)
at android.widget.TextView.sendOnTextChanged(TextView.java:7373)
at android.widget.TextView.handleTextChanged(TextView.java:7432)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9044)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:674)
at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:437)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:333)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5388)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)[/syntax]

И ещё: Можно ли, что б в ListView бралась информация не с одного <string-array name="xxx"> а с нескольких, и так же при вводе текста искала совпадение и в них?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Как создать поиск?

Сообщение doter.ua » 02 мар 2015, 19:34

SearchableActivity.java:55 строчку в студию, где-то в ней затаилось НПЕ
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Petrik
Сообщения: 18
Зарегистрирован: 12 фев 2015, 18:10

Re: Как создать поиск?

Сообщение Petrik » 02 мар 2015, 21:23

[syntax=java]SearchableActivity.this.adapter.getFilter().filter(cs);[/syntax]

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Как создать поиск?

Сообщение doter.ua » 02 мар 2015, 22:30

SearchableActivity.this что за прием такой? ссылки на инстанс активити нету?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

Re: Как создать поиск?

Сообщение finberg » 03 мар 2015, 14:45

Добрый день!
В приложении есть ArrayList<Product>, в Product есть String name. Необходимо в приложении сделать поиск по названию продуктов.
Начал реализовывать с помощью SearchView и возникло пару непонятных моментов. Мне надо, чтобы при вводе названия появлялся выпадающий вниз список с подходящими продуктами, при нажатии на элемент списка, выводилось его детальное описание, я так понимаю в новой активности. А если пользователь нажмет на клавиатуре в процессе поиска кнопку поиска, то должен вывестись GridView всех подходящих продуктов.
Из описания на android developer мне не совсем понятно. Где необходимо прописывать meta-data, в активности, в которой меню с поиском или в объявлении активности, которая запускается при поиске?
<activity ... >
...
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />

</activity>

а если мне надо выводить результат в виде выпадающего списка, мне нужно использовать поисковую активность, или как-то по другому? Вообще эта активность запускается когда, когда человек начал ввод?
И вторая проблема:
getMenuInflater().inflate(R.menu.menu_with_search_and_basket, menu);

MenuItem search = menu.findItem(R.id.menu_search); //тут ок

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); // а здесь всегда null
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;

xml меню
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
android:id="@+id/menu_search"
android:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/icon_search"
android:title="@string/menu_search"
app:showAsAction="collapseActionView|ifRoom"/>

</menu>
пробовал и android.widget.SearchView, результат тот же

Petrik
Сообщения: 18
Зарегистрирован: 12 фев 2015, 18:10

Re: Как создать поиск?

Сообщение Petrik » 03 мар 2015, 17:54

doter.ua писал(а):SearchableActivity.this что за прием такой? ссылки на инстанс активити нету?
Делал по примеру отсюда http://www.androidhive.info/2012/09/and ... -listview/

UPD. Что то тыкал, менял и вроде как, каким то чудом, получилось. Спасибо, что откликнулись на помощь.

forsila
Сообщения: 1
Зарегистрирован: 24 авг 2017, 18:31

Re: Как создать поиск?

Сообщение forsila » 24 авг 2017, 18:35

Делал по примеру отсюда http://www.androidhive.info/2012/09/and ... -listview/
Как сделать что бы можно было искать русские слова в списке, а то он только на английском ищет??

Аватара пользователя
Jaroww
Сообщения: 35
Зарегистрирован: 07 июн 2020, 22:57

Re: Как создать поиск?

Сообщение Jaroww » 08 июн 2020, 05:24

По подробней конечно можно, но для начала вам придется познакомится с основами информационного поиска, чтобы мы могли говорить на одном языке. Учитывая предмет, минимум это :

Аватара пользователя
Jaroww
Сообщения: 35
Зарегистрирован: 07 июн 2020, 22:57

Re: Как создать поиск?

Сообщение Jaroww » 08 июн 2020, 05:24

UPD. Что то тыкал, менял и вроде как, каким то чудом, получилось. Спасибо, что откликнулись на помощь.

Ответить