带有自定义建议适配器的Android SearchView

时间:2014-03-24 21:53:27

标签: android sqlite searchview

我有一个带有SimpleCursorAdapter的SearchView,它可以查询来自SQLite DB的建议。查询工作正常,SearchView会弹出一个包含建议的列表。但是这些建议不可见。例如,如果有两个建议,可以看到有两个列表条目,但不显示文本。 SearchView包含在DialogFragment中。

这是游标适配器和搜索视图的初始化:

suggestionAdapter = new SimpleCursorAdapter(getActivity(),
            android.R.layout.simple_list_item_1,
            null,
            new String[]{"name"},
            new int[]{android.R.layout.simple_list_item_1},
            0);

final SearchView searchProd = (SearchView) dialogView.findViewById(R.id.searchProd);
searchProd.setOnQueryTextListener(this);
searchProd.setOnSuggestionListener(this);
searchProd.setSuggestionsAdapter(suggestionAdapter);

在onQueryTextChanged中生成搜索建议,生成新光标并将其注入suggestAdapter:

@Override
public boolean onQueryTextChange(String newText) {
    String[] columns = new String[]{"_id", "name"};
    String selection = "name LIKE ?";
    String[] selectionArgs = new String[]{newText + "%"};
    Cursor c = db.query(TABLE_NAME,
            columns,
            selection,
            selectionArgs,
            null,
            null,
            null);
    if (c.getCount() > 0) {
        suggestionAdapter.changeCursor(c);
        suggestionAdapter.notifyDataSetChanged();
        return true;
    } else {
        return false;
    }
}

3 个答案:

答案 0 :(得分:2)

问题是适配器将显示具有列名称的数据,例如SUGGEST_COLUMN_TEXT_1。这是搜索下拉框中显示的列。但是你的游标使用数据库列名* name"在你的情况下。因此,您需要做的是告诉适配器将数据库列与适配器列匹配。我这样做的方法是使用hashMap.put(name,name +" as" SearcgManager.SUGGEST_COLUMN_TEXT_1)创建一个HashMap,然后在SQLiteBuilder中创建mSqliteBuilder,你可以在创建之前执行mSqliteBuilder.setProjectionMap(hashMap)你的光标。我没有使用onQueryTextChange进行搜索建议,但使用contentprovider和可搜索的配置文件。但是因为列不匹配是为什么我认为你没有在列表中看到你的建议

答案 1 :(得分:0)

问题是您为to的构造函数中的SimpleCursorAdapter()字段提供了布局。您应该为文本视图提供资源ID,例如android.R.id.text1

答案 2 :(得分:0)

我有类似的问题。事实证明,我需要做的就是更改列出的条目中显示的文本的颜色。所以我有类似



<TextView
        android:id="@+id/item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FFF2FF"
        />
&#13;
&#13;
&#13;

我希望这会有所帮助。