AutoCompleteTextView с доменами электронной почты android


Таким образом, у меня есть поле autocompletetextview в моем приложении, которое я хочу, чтобы пользователь ввел свой адрес электронной почты. Теперь, чтобы помочь ему печатать быстрее и не делать ошибок, я хочу предложить ему большинство серверов доменов электронной почты commons при вводе.

Я использую этот элемент управления с этим массивом

String[] arraymails ={"@gmail.com","@hotmail.com","@yahoo.com","@outlook.com"};  

И это в oncreate

mEmailView = (AutoCompleteTextView) findViewById(R.id.register_email);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arraymails);  
mEmailView.setAdapter(adapter);

Идея заключается в том, что, когда пользователь вводит символ"@", а затем "g", он предлагает @gmail.com.

Это прекрасно работает, если я начинаю печатать в текстовом поле непосредственно "@g..- но если я наберу что-нибудь раньше, например "john@gm", это не сработает.

Существует ли какой-либо подстановочный знак, например "*@gmail.com-за то, что сделал это? или как мне его реализовать?

Спасибо

2 3

2 ответа:

После нескольких дней и поисков повсюду решения, не смог найти его. Я публикую его, потому что это может кому-то помочь.

Методом проб и ошибок, исследовав несколько сайтов и путеводителей, я смог найти решение, которое искал.

Это изображения того, как выглядит решение:

Текстовое поле, вы можете ввести все, что хотите, Джон является примером.

Изображение 1

Просто набрав "@", вы получите список всех возможных вариантов. Домены

Изображение 2

И вы можете отфильтровать немного больше, начав вводить доменное имя

Изображение 3

Код:

Класс CustomFilterAdapter

public class CustomFilterAdapter extends ArrayAdapter<String> {
    private final String MY_DEBUG_TAG = "CustomFilterAdapter";
    private ArrayList<String> items;
    private ArrayList<String> itemsAll;
    private ArrayList<String> suggestions;
    private int viewResourceId;

public CustomFilterAdapter(Context context, int viewResourceId, ArrayList<String> items) {
    super(context, viewResourceId, items);
    this.items = items;
    this.itemsAll = (ArrayList<String>) items.clone();
    this.suggestions = new ArrayList<String>();
    this.viewResourceId = viewResourceId;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(viewResourceId, null);
    }
    String customer = items.get(position);
    if (customer != null) {
        TextView customerNameLabel = (TextView)v;
        if (customerNameLabel != null) {
            customerNameLabel.setText(customer);
        }
    }
    return v;
}

@Override
public Filter getFilter() {
    return nameFilter;
}

Filter nameFilter = new Filter() {
    public String convertResultToString(Object resultValue) {
        String str = (String)resultValue; 
        return str;
    }
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        if (constraint != null){
        String palabra = constraint.toString();
        if(palabra != null && palabra.indexOf("@") != -1) {
            String palabra2 = palabra.substring(palabra.indexOf("@"));
            String antesArroba;
            try{
                antesArroba = palabra.substring(0, palabra.indexOf("@"));
            }catch (Exception ex)
            {
                antesArroba ="";
            }
            suggestions.clear();
            for (String customer : itemsAll) {
                if(customer.toLowerCase().startsWith(palabra2.toString().toLowerCase())){
                    suggestions.add(antesArroba+customer);
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = suggestions;
            filterResults.count = suggestions.size();
            return filterResults;
        } else {
            return new FilterResults();
        }
        }else {
            return new FilterResults();
        }
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        ArrayList<String> filteredList = (ArrayList<String>) results.values;
        if(results != null && results.count > 0) {
            clear();
            for (String c : filteredList) {
                add(c);
            }
            notifyDataSetChanged();
        }
    }
};

}

Об активности onCreate (вы можете добавить сюда все, что хотите)

arraymails = new ArrayList();
arraymails.add("@gmail.com");
arraymails.add("@hotmail.com");
arraymails.add("@yahoo.com");
arraymails.add("@outlook.com");
arraymails.add("@adinet.com.uy");

mEmailView = (AutoCompleteTextView) findViewById(R.id.register_email);
mEmailView.setText(mEmail);
CustomFilterAdapter adapter = new CustomFilterAdapter(this,android.R.layout.simple_list_item_1,arraymails); 

И это все.

Удачи!

Я думаю, что вы должны создать свой собственный адаптер, расширяя BaseAdapter, и в методе getView вы должны создать свою собственную логику там

Пример Ссылки