Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
kalyashov
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 40
#1

Как правильно сделать SearchView с выпадающим списком? - Программирование Android

21.09.2015, 14:31. Просмотров 340. Ответов 0
Метки нет (Все метки)

Пример во вложениях.

Хочу сделать searchView c выпадающим списком.


Есть класс SearchDbAdapter, написанный по статье с habrahabr


Есть виртуальная FTS-таблица, которая содержит два столбца. Первый столбец (KEY_INPUT) — это список возможных запросов пользователей. Второй столбец (KEY_ANKER) — список html-файлов с якорями соответствующий этим запросам.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class SearchDbAdapter {
    private static final String DATABASE_NAME = "mhdb";
    private static final String FTS_VIRTUAL_TABLE = "srcht";
    private static final int DATABASE_VERSION = 1;
    public static final String KEY_INPUT = "rqst";
    public static final String KEY_ANKER = "ankr";
 
    private static final String DATABASE_CREATE = "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + " USING fts3(" + KEY_INPUT + "," + KEY_ANKER + ");";
 
    private final Context mCtx;
 
    // Массив с поисковыми запросами (темами и разделами, содержащимися в файлах)
    public static final String search_arr[] = {"data1","data2","data3",data4"};
    // Массив с соответствующими им html-файлами с якорями (файлы хранятся в папке assets проекта)
    public static final String ankers_arr[] = {"file1.html#an1","file2.html#an2","file1.html#an3","file1.html#an4"};
 
    private DatabaseHelper mDbHelper;
    private static SQLiteDatabase mDb;
 
    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
 
            db.execSQL(DATABASE_CREATE);
            int LNGTH = search_arr.length;
            ContentValues initValues = new ContentValues();
            for(int i=0; i<LNGTH; i++){
                initValues.put(KEY_INPUT, search_arr[i]);
                initValues.put(KEY_ANKER, ankers_arr[i]);
                db.insert(FTS_VIRTUAL_TABLE, null, initValues);
                initValues.clear();
            }
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + FTS_VIRTUAL_TABLE);
            onCreate(db);
        }
    }
 
    public SearchDbAdapter(Context ctx) {
        this.mCtx = ctx;
    }
 
    public SearchDbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }
 
    public void close() {
        if (mDbHelper != null) {
            mDbHelper.close();
        }
    }
 
    //метод, возвращающий курсор с данными
    public static Cursor searchAnker(String inputText) throws SQLException {
        inputText = inputText.toLowerCase();
        String query = "SELECT docid as _id," + KEY_INPUT + "," + KEY_ANKER + " FROM " + FTS_VIRTUAL_TABLE + " WHERE " +  KEY_INPUT + " MATCH '" + inputText + "';";
        Cursor mCursor = mDb.rawQuery(query,null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
}


Работа с SearchView ведется следующим образом:
1. В SearchView вводится поисковый запрос «data2». Слушатель SearchView вызывает метод searchAnker() класса SearchDbAdapter, который возвращает курсор (mCursor), содержащий запросы похожие на введенный текст и соответствующие этим запросам html-файлы с якорями: data2 request 3 — file1.html#an3 data2 request 4 — file2.html#an4
2. Содержащиеся в mCursor похожие запросы отображаются в выпадающем списке: data2 request 3, data2 request 4.
3. При клике по элементам выпадающего списка осуществляется запуск activity, в которую с интентом передаётся соответствующее имя html-файла с якорем из mCursor: file1.html#an3


Но я не до конца понимаю, как сделать этот самый выпадающий список.


Также столкнулся еще с одной проблемой, searchAnker почему-то возвращает пустой курсор, попробовал все варианты, которые есть в столбце KEY_INPUT


В методе onQueryTextChange я вызываю searchAnker(query), которому передается введенный текст query:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String text) {
 
            Toast toast = Toast.makeText(getApplicationContext(), "Text submit", Toast.LENGTH_SHORT);
            toast.show();
 
            return true;
        }
 
        @Override
        public boolean onQueryTextChange(String query) {
 
            try {
                cursor = sdb.searchAnker(query);
 
            } catch (SQLException e) {
                e.printStackTrace();
            }
 
            if(cursor.getCount() != 0)
            {
                // формируем столбцы сопоставления
                String[] from = new String[] { SearchDbAdapter.KEY_INPUT};
                int[] to = new int[] { R.id.search_result_text_view };
 
                // создааем адаптер и настраиваем список
                cursorAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.result_search_item, cursor, from, to, 0);
 
                searchView.setSuggestionsAdapter(cursorAdapter);
 
                return true;
            }
            else
            {
                return false;
            }
        }
    });

Что я делаю не так и как правильно реализовать этот выпадающий список?
0
Миниатюры
Как правильно сделать SearchView с выпадающим списком?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2015, 14:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно сделать SearchView с выпадающим списком? (Программирование Android):

Кнопка с выпадающим списком - Программирование Android
Здравствуйте возник такой вопрос. как сделать кнопку с выпадающим списком. точнее как overflow в action бар только для своей кнопки. ...

Как сделать AlertDialog со списком с цветными строками? - Программирование Android
Вопрос новичка. Собственно subj. Есть список из десятка ЦВЕТОВ, которые нужно выбирать из списка. Из выпадающего списка или по нажатию...

SearchView как выводить текст ничего не найдено - Программирование Android
Есть поиск по RV/ в поиске не силен сделал по туториалу какому то, но теперь возник вопрос как выводить текст или toast если ничего...

Как добавить динамически в ToolBar виджет SearchView в нужных фрагментах - Программирование Android
У меня есть Toolbar в MainActivity и нужно получить доступ к этому ToolBar во фрагменте MainActivity и добавить туда SearchView. Как такое...

Searchview закрыть поиск программно, также как закрывается кнопкой back - Программирование Android
Осуществляется поиск по списку listview, нужно при клике на элемент списка, чтобы закрывался поиск, также как он закрывается при нажатии ...

Как правильно сделать SwipeLayout - Программирование Android
у меня есть такая разметка &lt;com.daimajia.swipe.SwipeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2015, 14:31
Привет! Вот еще темы с ответами:

Как правильно сделать такие отступы - Программирование Android
Я приложил файл с дизайном на нем вокруг картинки везде равные отступы. Как такие отступы вокруг изображения правильно сделать? Пробовал...

Как правильно сделать такую кнопку - Программирование Android
Всем привет, хочу сделать кнопку как тут (там где твиттер, фи и гугл). То есть сначала идет на чуть более темном фоне иконка действия,...

Как правильно сделать PRO версию проекта - Программирование Android
Коллеги, Как сделать PRO версию проекта и затем работать уже с двумя одинаковыми проектами Free и PRO?

Как сделать чтобы кнопка правильно располагалась - Программирование Android
Как сделать чтобы кнопка располагалась поверх RecyclerView и в тоже время внизу экрана(привязана к нижней его границе)? Вот разметка ...


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

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

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