Форум программистов, компьютерный форум CyberForum.ru

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

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

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

21.09.2015, 14:31. Просмотров 306. Ответов 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;
            }
        }
    });

Что я делаю не так и как правильно реализовать этот выпадающий список?
Миниатюры
Как правильно сделать SearchView с выпадающим списком?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2015, 14:31     Как правильно сделать SearchView с выпадающим списком?
Посмотрите здесь:
Кнопка с выпадающим списком Android
Как сделать AlertDialog со списком с цветными строками? Android
Как добавить динамически в ToolBar виджет SearchView в нужных фрагментах Android
Searchview закрыть поиск программно, также как закрывается кнопкой back Android
Android Как правильно сделать SwipeLayout
Android Как правильно сделать такую кнопку
Android Как правильно сделать такие отступы
Как правильно сделать PRO версию проекта Android
Как сделать чтобы кнопка правильно располагалась Android
Android Как правильно сделать паузу в ходе работы приложения?
Android Searchview в toolbar
Android SearchView в ActionBar

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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