【问题标题】:SearchView Suggestion doesn't work with one characterSearchView 建议不适用于一个字符
【发布时间】:2014-08-07 05:55:23
【问题描述】:

我的SearchView 建议有问题,当我在SearchView 中写一个字符时,建议没有出现。 但是当我在SearchViewEditText 中写两个字符时,建议就会出现。

所以我希望当我在SearchViewEditText 中写一个字符时,我的建议已经出现,我该怎么办?

我的 MainActivity 代码:

private SearchView mSearchView;
private SimpleCursorAdapter mAdapter;
private ArrayList<String> mList;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mList = new ArrayList<String>();
    mList.add("Test 1");
    mList.add("Test 2");
    mList.add("Test 3");
    mList.add("Test 4");
    mList.add("Test 5");
    mList.add("Test 6");
    mList.add("Test 7");
    mList.add("Test 8");
    mList.add("Test 9");
    mList.add("Test 10");

    ListView listView = (ListView) findViewById(android.R.id.list);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList);
    listView.setAdapter(adapter);

    mAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.suggestion, null, new String[] {""}, new int[] {R.id.suggestion_textView}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    super.onCreateOptionsMenu(menu);

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    MenuItem searchItem = menu.findItem(R.id.menu_search);
    mSearchView = (SearchView) searchItem.getActionView();

    mSearchView.setSuggestionsAdapter(mAdapter);

    // onItemClick
    mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener()
    {
        @Override
        public boolean onSuggestionSelect(int position)
        {
            return false;
        }

        @Override
        public boolean onSuggestionClick(int position)
        {
            // Only for Test
            finish();
            return false;
        }
    });

    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
    {
        @Override
        public boolean onQueryTextSubmit(String s)
        {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s)
        {
            final MatrixCursor c = new MatrixCursor(new String[] { BaseColumns._ID, "" });

            for (int i=0; i < mList.size(); i++)
            {
                    c.addRow(new Object[] {i, mList.get(i)});

            }
            mAdapter.changeCursor(c);
            return false;
        }
    });

    return true;
}

【问题讨论】:

    标签: android searchview


    【解决方案1】:

    我自己找到了解决方案。它不干净,但它会工作。 我已经调试到SearchView,然后我从SearchView 中找到了AutoCompleteTextView 的ID。我将AutoCompleteTextView 的阈值从 2 设置为 1。现在它可以工作了。

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        MenuItem searchItem = menu.findItem(R.id.menu_search);
        mSearchView = (SearchView) searchItem.getActionView();
    
        // Solution
        int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null);
        AutoCompleteTextView searchAutoCompleteTextView = (AutoCompleteTextView) mSearchView.findViewById(autoCompleteTextViewID);
        searchAutoCompleteTextView.setThreshold(1);
        ///////////
    
        mSearchView.setSuggestionsAdapter(mAdapter);
    
        // onItemClick
        mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener()
        {
            @Override
            public boolean onSuggestionSelect(int position)
            {
                return false;
            }
    
            @Override
            public boolean onSuggestionClick(int position)
            {
                // Only for Test
                finish();
                return false;
            }
        });
    
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
        {
            @Override
            public boolean onQueryTextSubmit(String s)
            {
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String s)
            {
                final MatrixCursor c = new MatrixCursor(new String[] { BaseColumns._ID, ""     });
                for (int i=0; i < mList.size(); i++)
                {
                    if (mList.get(i).toLowerCase().startsWith(s.toLowerCase()))
                    {
                        c.addRow(new Object[]{i, mList.get(i)});
                    }
                }
                mAdapter.changeCursor(c);
    
                return false;
            }
        });
    return true;
    }
    

    【讨论】:

    • 如果您使用的是 appcompat,则 id 应为 getResources().getIdentifier("search_src_text", "id", getPackageName())
    • 如果你使用appcompat你也可以直接引用R.id.search_src_text
    • @user3747780 你是我最喜欢的人
    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多