在 searchview 中键入时如何更改 listview-cursoradapter 中搜索文本的背景颜色?

Posted

技术标签:

【中文标题】在 searchview 中键入时如何更改 listview-cursoradapter 中搜索文本的背景颜色?【英文标题】:How to change background color of searched text in listview-cursoradapter while typing in searchview? 【发布时间】:2015-08-10 13:16:58 【问题描述】:

我看过关于使用Spannable 字符串突出显示listview 中的文本的教程,但是没有关于从数据库中搜索文本并在listview 中突出显示的教程。

我有一个listview,它从database/cursor 获取数据并在cursoradapter 的帮助下显示。我已将searchview 放在action bar 中以从数据库表中搜索文本。

现在我希望当我在搜索视图中输入字符或单词时,database table 中的每个匹配结果都应突出显示/更改 listviewtextview 的背景颜色。

我对在哪里执行搜索操作(在activitycursoradapter)以及如何显示结果感到困惑?

此代码处于活动状态,我可以通过类似查询从 db 获取结果。

@Override
public boolean onCreateOptionsMenu(Menu menu) 

    getMenuInflater().inflate(R.menu.search_menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));
    searchView.setOnQueryTextListener(this);
    return true;


@Override
public boolean onQueryTextChange(String text) 

    searchText(text + "*");
    return false;


@Override
public boolean onQueryTextSubmit(String text) 

    searchText(text + "*");
    return false;


private void searchText(String text) 

    if (text != null) 

        localDB.openDB();
        Cursor cursor = localDB.searchDBText(text);
        if (cursor != null && cursor.moveToFirst()) 

            String message = cursor.getString(cursor
                    .getColumnIndex(LocalStoreDB.ROW_MESSAGE));

            Log.i("searchText message:", message);
         else 

            Log.i("searchText message:", "cursor is null");
        
        cursor.close();
        localDB.closeDB();
     else 

        Log.i("searchText message:", "input text is null");
    

【问题讨论】:

最好发布您迄今为止尝试过的代码,以便人们可以更轻松地帮助您 你可以使用filter list 和SpannableString 如何在这段代码中使用filter?能详细点吗? 【参考方案1】:

抱歉,过了一会儿才回复,但它仍然会帮助有需要的人。

我最终要做的是将文本传递给适配器中的方法,然后在 bindView() 中找到文本 Pattern-Matcher 并使用 SpannableString 突出显示文本

以下是适配器中的代码:

public class AdapterSingleChat extends CursorAdapter 

    private static int indexThumb;

    //String to search and highlight
    String textToSearch = null;

    public AdapterSingleChat(Context context, Cursor cursor, int flags) 
        super(context, cursor, flags);

        //caching the column index
        indexThumb = cursor.getColumnIndex(SQLiteStoreDB.ROW_TEXT);
   

   //ViewHolder()...

   //newView()....

   @Override
   public void bindView(View view, Context context, Cursor cursor)

        //Text from cursor in which search will perform
        String cursorText = cursor.getString(indexText);

        //Spannable string to highlight matching searched words
        SpannableString spannableStringSearch = null;

        if ((textToSearch != null) && (!textToSearch.isEmpty())) 


            spannableStringSearch = new SpannableString(cursorText);

            //compile the pattern of input text
            Pattern pattern = Pattern.compile(textToSearch,
                    Pattern.CASE_INSENSITIVE);

            //giving the compliled pattern to matcher to find matching pattern in cursor text
            Matcher matcher = pattern.matcher(cursorText);
            spannableStringSearch.setSpan(new BackgroundColorSpan(
                        Color.TRANSPARENT), 0, spannableStringSearch.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            while (matcher.find()) 

                //highlight all matching words in cursor with white background(since i have a colorfull background image)
                spannableStringSearch.setSpan(new BackgroundColorSpan(
                            Color.WHITE), matcher.start(), matcher.end(),
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            
        

        if(spannableStringSearch != null

            //if search has performed set spannable string in textview
            holder.tvCursorText.setText(spannableStringSearch);
        else

            //else set plain cursor text
            holder.tvCursorText.setText(cursorText);
        
   

   //Pass the text from activity(from  SearchManager, EditText or any other input type) here
   private void searchText(String text) 

       this.textToSearch = text;
   

是的,输入单词后不要忘记swapCursor()notifyDataSetChanged()

【讨论】:

以上是关于在 searchview 中键入时如何更改 listview-cursoradapter 中搜索文本的背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 SearchView 上的默认图标,以便在 Android 的操作栏中使用?

对于键入的单个字符,SearchView 提示未显示

如何更改SearchView上的默认图标,以便在Android的操作栏中使用?

更改 SearchView 上的工具栏颜色/样式单击

更改操作栏searchview提示文本颜色

如何更改 android SearchView 文本