我的主要活动代码:
// here you put all your data.
String[] dataArray = { "Amit sharma Kumar", "Hisham Kumar Munner",
"Vineet John Chaturvedi", "Lucky Kumar Verma" };
ArrayList<String> alAutoCompleteList;
AutoCompleteTextView acTV;
ArrayAdapter<String> adapter1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// etAuto = (EditText) findViewById(R.id.etAuto);
acTV = (AutoCompleteTextView) findViewById(R.id.acTV);
// Arraylist
alAutoCompleteList = new ArrayList<String>();
adapter1 = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_dropdown_item_1line, alAutoCompleteList);
acTV.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
if (acTV.enoughToFilter()) {
acTV.showDropDown();
acTV.bringToFront();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
alAutoCompleteList.clear();
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
String acText = acTV.getText().toString().trim();
for (String item : dataArray) {
if (item.toLowerCase().contains(acText.toLowerCase())) {
alAutoCompleteList.add(item);
}
}
acTV.setThreshold(4);
acTV.setAdapter(adapter1);
acTV.showDropDown();
}
});
当我搜索“夏尔马”并按下空格后,建议就会消失。我希望这些建议留在那里。我试图做一切但没有取得任何成功。有人可以帮忙吗?
编辑:
有人可以在他们的模拟器上试用这段代码吗?只需在xml中添加AutoCompleteTextView
并运行它即可。
答案 0 :(得分:15)
首先,您是否有理由在TextWatcher
上设置AutoCompleteTextView
听众?如果您这样做是为了自己过滤数据,则不应该这样做(因为默认情况下小部件会执行此操作并且您的代码不正确)。
当我搜索“夏尔马”并在那之后按空格。建议去 关闭。我希望这些建议留在那里。
这是因为适配器和它附带的默认Filter
实现,AutoCompleteTextView
在引擎盖下使用的元素提供了您在下拉列表中看到的值。 ArrayAdapter
的默认行为是您看到的行为,您可以在this answer中找到解释。解决方案是使用过滤器实现您自己的适配器,该过滤器将搜索整个适配器的行数据以查找过滤器字符串。我从SDK中获取了ArrayAdapter
类的代码并稍作调整,因此在单词后插入空格时过滤不会中断。您可以找到类here,因为代码要发布大。只需复制项目中的类,并将其用作普通ArrayAdapter
:
FilterWithSpaceAdapter<String> adapter1;
//...
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this,
android.R.layout.simple_dropdown_item_1line, dataArray);
答案 1 :(得分:2)
您不需要Textwatcher,AutoCompleteTextView使用您设置的适配器的过滤器。默认适配器通过调用它们上的toString()来过滤条目。当然,如果用户输入空格,则值不再匹配。要实现此自定义行为,您不应添加textwatcher,而是构建自定义适配器。您仍然可以扩展ArrayAdapter或SimpleAdapter。您可以通过覆盖getFilter()和publishResults()来实现自定义过滤行为(在您的情况下为trim()调用)。 Here或here您可以找到有关如何执行此操作的示例。
答案 2 :(得分:2)
首先,TextWatcher
AutoCompleteTextView
不需要AutoCompleteTextView
,因为MyWatcher
有自己的观看文字的方法,即setThreshold(3);
final String[] AndroidDesk= getResources().getStringArray(R.array.clothname_arrays);
ArrayAdapter<String> My_arr_adapter= new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_dropdown_item_1line,AndroidDesk);
cloths.setThreshold(1);
cloths.setAdapter(My_arr_adapter);
cloths.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
}
});
。你需要使用:
{{1}}
答案 3 :(得分:0)
我认为文本观察器存在问题,因为自动完整文本视图不需要文本观察器,因为该自动侦听器事件。你必须简单地将数组传递给适配器而不是列表。 alAutoCompleteList ther在列表中没有任何值。你从来没有在列表中增加价值。
要么你必须这样做: alAutoCompleteList.add(“data one”); alAutoCompleteList.add(“data two”);
或将dataArray传递给适配器。 adapter1 = new ArrayAdapter(MainActivity.this, android.R.layout.simple_dropdown_item_1line,dataArray);
无需使用文本观察器。