再会。我的Android应用程序中有一个AutoCompleteTextView,它运行正常。但是,我注意到建议是基于提供给AutoCompleteTextView的列表的子字符串的第一个字符。就其本身而言,这很好,但是我想要它还显示包含用户输入的项目。
例如,让我们使用以下列表:
键入
ad
将建议使用Adipose
,但是,我也希望建议使用Bad Wolf
,因为它在ad
中包含Bad
。这不会发生,因为AutoCompleteTextView仅在列表项中而不是在这些子字符串中查看子字符串的开头(子字符串由空格分隔)。有什么方法可以使AutoCompleteTextViews推荐包含输入文本的项目,而不管该文本在列表项目中的位置如何?
谢谢你的帮助。
编辑/更新
请在下面查看pskink的评论。我尝试实现以下相同的解决方案。
我推断出的逻辑是,将使用
SimpleCursorAdapter
,而不是通用的ArrayAdater
。然后,我为FilterQueryProvider
创建了一个SimpleCursorAdapter
。现在,使用runQuery
的FilterQueryProvider
方法,我可以通过搜索用户的约束输入列表来运行过滤器算法。这是代码://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[] columnNames
和MatrixCursor
变量的方式存在问题。有人可以帮忙吗?我之前没有使用过带有游标适配器的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/