再会。我的Android应用程序中有一个AutoCompleteTextView,它运行正常。但是,我注意到建议是基于提供给AutoCompleteTextView的列表的子字符串的第一个字符。就其本身而言,这很好,但是我想要它还显示包含用户输入的项目。

例如,让我们使用以下列表:

  • 脂肪
  • 坏狼
  • 网络人
  • Daleks

  • 键入ad将建议使用Adipose,但是,我也希望建议使用Bad Wolf,因为它在ad中包含Bad。这不会发生,因为AutoCompleteTextView仅在列表项中而不是在这些子字符串中查看子字符串的开头(子字符串由空格分隔)。

    有什么方法可以使AutoCompleteTextViews推荐包含输入文本的项目,而不管该文本在列表项目中的位置如何?

    谢谢你的帮助。

    编辑/更新

    请在下面查看pskink的评论。我尝试实现以下相同的解决方案。

    我推断出的逻辑是,将使用SimpleCursorAdapter,而不是通用的ArrayAdater。然后,我为FilterQueryProvider创建了一个SimpleCursorAdapter。现在,使用runQueryFilterQueryProvider方法,我可以通过搜索用户的约束输入列表来运行过滤器算法。这是代码:
    //initialize the ACTV
    AutoCompleteTextView search = (AutoCompleteTextView) findViewById(R.id.actvCatalogueSearch);
    search.setThreshold(1); //set threshold
    
    //experiment time!!
    
    //I honestly don't know what this is for
    int[] to = { android.R.id.text1 };
    
    //initializing the cursorAdapter.
    //please note that pdflist is the array I used for the ACTV value
    SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this,
            android.R.layout.simple_dropdown_item_1line, null, pdflist, to, 0);
    
    cursorAdapter.setStringConversionColumn(1);
    
    //FilterQueryProvider here
    FilterQueryProvider provider = new FilterQueryProvider(){
        @Override
        public Cursor runQuery(CharSequence constraint) {
            // TODO Auto-generated method stub
            Log.d("hi", "runQuery constraint: " + constraint);
            if (constraint == null) {
                return null;
            }
            String[] columnNames = { Columns._ID, "name" };
            MatrixCursor c = new MatrixCursor(columnNames);
    
            try {
                //loop through the array, then when an array element contains the constraint, add.
                for (int i = 0; i < pdflist.length; i++) {
                    if(pdflist[i].contains(constraint)){
                        c.newRow().add(i).add(pdflist[i]);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return c;
        }
    };
    
    cursorAdapter.setFilterQueryProvider(provider);
    search.setAdapter(cursorAdapter);
    

    显示了runQuery constraint的Log语句,但是,此后,应用程序崩溃了,并且我在logcat中收到此错误:
    requesting column name with table name -- <first element of array here>
    .....
    java.lang.IllegalArugmentException: column <first element of array here> does not exist
    

    单击logCat错误行将打开jar文件,但没有一个指向代码中的一行。但是,从某些错误行来看,我认为我使用String[] columnNamesMatrixCursor变量的方式存在问题。

    有人可以帮忙吗?我之前没有使用过带有游标适配器的Filter Query Providers,所以我对如何进行此操作一无所知。

    很感谢任何形式的帮助。谢谢你。

    最佳答案

    好的,这就是我的工作方式。主要 Prop 以pskink为主导。
    它与我上面的代码非常相似,但进行了一些更改以使runQuery方法起作用。

    使用相同的逻辑/思维模式,只是我更改了runQuery方法。阅读注释以获取演练。

    //create ACTV Here
    AutoCompleteTextView search = (AutoCompleteTextView) findViewById(R.id.actvCatalogueSearch);
    search.setThreshold(1);
    
    //I don't know what these are for, honestly.
    String[] from = { "name" };
    int[] to = { android.R.id.text1 };
    
    //create a simple cursorAdapter
    SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this,
            android.R.layout.simple_dropdown_item_1line, null, from, to, 0);
    
    //again, I don't know what this is for
    cursorAdapter.setStringConversionColumn(1);
    
    //create the filter query provider
    FilterQueryProvider provider = new FilterQueryProvider(){
        @Override
        public Cursor runQuery(CharSequence constraint) {
            // TODO Auto-generated method stub
            //I need to do this because my list items are in all caps
            String constrain = (String) constraint;
            constrain = constrain.toUpperCase();
    
            if (constraint == null) {
                return null;
            }
    
            //I'll be honest again, no clue what these lines do.
            String[] columnNames = { Columns._ID, "name" };
            MatrixCursor c = new MatrixCursor(columnNames);
    
            try {
                //here's what I do, I go though my Array (pdflist)
                //when a list item contains the user input, I add that to the Matrix Cursor
                //this matrix cursor will be returned and the contents will be displayed
                for (int i = 0; i < pdflist.length; i++) {
                    if(pdflist[i].contains(constrain)){
                        c.newRow().add(i).add(pdflist[i]);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return c;
        }
    };
    
    //use the filter query provider on the cursor adapter
    cursorAdapter.setFilterQueryProvider(provider);
    
    //finally, use the adapter on your ACTV
    search.setAdapter(cursorAdapter);
    

    这是一项工作,但可以完成工作。老实说,我对此感到有些惊讶,因为它没有“直截了当/直观”的方式。只需在AutoCompleteTextView中启用/禁用某些功能即可完成操作。

    我猜我们将不得不坚持这种解决方案,直到另行通知。

    关于Android-AutoCompleteTextView通配符建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27151005/

    10-13 04:37