今天看到AutoCompleteTextView的时候想到这个问题,就实现了一下。
0x01 AutoCompleteTextView
private void method1() {
AutoCompleteTextView textView= (AutoCompleteTextView) findViewById(R.id.tv_input);
textView.setThreshold(1);
List<String> data=new ArrayList<>();
data.add("123@qq.com");
data.add("123@163.com");
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,data);
textView.setAdapter(adapter);
}
0x02 在输入@时才提示
2.1
想在输入后判断,结果发现notifyDataSetChanged();并没有用,无语了,总是遇到adapter的这个问题……
private void method2() {
mTextViewInput = (AutoCompleteTextView) findViewById(R.id.tv_input);
mTextViewInput.setThreshold(1);
mData =new ArrayList<>();
mAdapter =new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, mData);
mTextViewInput.setAdapter(mAdapter);
mTextViewInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
//最终选了这个方法,不能在afterTextChanged中,AutoCompleteTextView的实现就是在afterTextChanged中的,要在它之前改变备选项
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String input=s.toString();
onInputChange(input);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
private void onInputChange(String input) {
mData.clear();
//至少位于第2个位置
if(input.indexOf("@")>0){
String pre=input.split("@")[0];
mData.add(pre+"@qq.com");
mData.add(pre+"@163.com");
}
//这里并没有作用,见2.2和2.3
mAdapter.notifyDataSetChanged();
}
2.2
改为下面的,重新设置了adapter,可是可以了,但心理很别扭。
private void afterInput(String input) {
mData.clear();
//至少位于第2个位置
if(input.indexOf("@")>0){
String pre=input.split("@")[0];
mData.add(pre+"@qq.com");
mData.add(pre+"@163.com");
}
mAdapter =new ArrayAdapter<String>(InputMailActivity.this,android.R.layout.simple_dropdown_item_1line, mData);
mTextViewInput.setAdapter(mAdapter);
}
2.3
data不是引用的吗,为什么变了data,调用notifyDataSetChanged却没用。
看了一下ArrayAdapter,可能是因为mOriginalValues的原因吧,具体也没看,不过找到解决方法了。
private void onInputChange(String input) {
mAdapter.clear();
//至少位于第2个位置
if(input.indexOf("@")>0){
String pre=input.split("@")[0];
mAdapter.add(pre+"@qq.com");
mAdapter.add(pre+"@163.com");
}
}
2.4 如果是多个呢
换为MultiAutoCompleteTextView
//多一个设置,一定要加,不然无效。
textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
private void onInputChange(String input) {
mAdapter.clear();
String[] inputArray=input.split(",");
String last=inputArray[inputArray.length-1];
//至少位于第2个位置
if(last.indexOf("@")>0){
String pre=last.split("@")[0];
mAdapter.add(pre+"@qq.com");
mAdapter.add(pre+"@163.com");
}
}
效果图