安卓实现自动提示选择邮箱

今天看到AutoCompleteTextView的时候想到这个问题,就实现了一下。

0x01 AutoCompleteTextView

    private void method1() {
        AutoCompleteTextView textView= (AutoCompleteTextView) findViewById(R.id.tv_input);
        textView.setThreshold(1);
        List<String> data=new ArrayList<>();
        data.add("[email protected]");
        data.add("[email protected]");
        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(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(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");
        }
    }

效果图
安卓实现自动提示选择邮箱_第1张图片
安卓实现自动提示选择邮箱_第2张图片

0x03参考文献

[1]AutoCompleteTextView
[2]MultiAutoCompleteTextView

你可能感兴趣的:(Android)