Лучшее решение для реализации AutoCompleteTextView? - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над реализацией решения для поиска среди 10000 продуктов и получения информации о них.Поэтому я решил внедрить AutoCompleteTextView, чтобы помочь пользователю найти продукт.Поиск среди различных решений Я реализовал один вариант, и он отлично работает, но мне интересно, есть ли какие-то рекомендации, чтобы узнать, можно ли улучшить решения или сделать их оптимальными?

Общая структура моих решений следующая:

---- Мой класс данных ----

public class CountryItem {

private String countryName;
private int flagImage;

public CountryItem(){}

public CountryItem(String countryName, int flagImage) {
    this.countryName = countryName;
    this.flagImage = flagImage;
}

public ArrayList<CountryItem> fillCountryList() {
    ArrayList<CountryItem> countryList = new ArrayList<>();
    countryList.add(new CountryItem("Afghanistan", R.drawable.afghanistan));
    countryList.add(new CountryItem("Albania", R.drawable.albania));
    countryList.add(new CountryItem("Algeria", R.drawable.algeria));
    return countryList;
}

public String getCountryName() {
    return countryName;
}

public int getFlagImage() {
    return flagImage;
}
}

---- MainClass ----

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ArrayList<CountryItem> countryList = new CountryItem().fillCountryList();
    AutoCompleteTextView editText = findViewById(R.id.actv);
    AutoCompleteCountryAdapter adapter = new AutoCompleteCountryAdapter(this, countryList);
    editText.setAdapter(adapter);
}
}

AdapterClass

public class AutoCompleteCountryAdapter extends ArrayAdapter<CountryItem> {

private List<CountryItem> countryListFull;

public AutoCompleteCountryAdapter(@NonNull Context context, @NonNull List<CountryItem> countryList) {
    super(context, 0, countryList);
    countryListFull = new ArrayList<>(countryList);
}

@NonNull
@Override
public Filter getFilter() {
    return countryFilter;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(
                R.layout.country_autocomplete_row, parent, false
        );
    }

    TextView textViewName = convertView.findViewById(R.id.text_view_name);
    ImageView imageViewFlag = convertView.findViewById(R.id.image_view_flag);

    CountryItem countryItem = getItem(position);

    if (countryItem != null) {
        textViewName.setText(countryItem.getCountryName());
        imageViewFlag.setImageResource(countryItem.getFlagImage());
    }

    return convertView;
}

private Filter countryFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();
        List<CountryItem> suggestions = new ArrayList<>();

        if (constraint == null || constraint.length() == 0) {
            suggestions.addAll(countryListFull);
        } else {
            String filterPattern = constraint.toString().toLowerCase().trim();

            for (CountryItem item : countryListFull) {
                if (item.getCountryName().toLowerCase().contains(filterPattern)) {
                    suggestions.add(item);
                }
            }
        }

        results.values = suggestions;
        results.count = suggestions.size();

        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        clear();
        addAll((List) results.values);
        notifyDataSetChanged();
    }

    @Override
    public CharSequence convertResultToString(Object resultValue) {
        return ((CountryItem) resultValue).getCountryName();
    }
};
}

Некоторые ссылки или комментарии могут помочь мне узнать, можно ли улучшить решение в каком-либо аспекте.

1 Ответ

0 голосов
/ 26 июня 2018

Существует много способов улучшить решение.1. Дебандинг фактор для уменьшения перерисовки пользовательского интерфейса.

Примеры кода и другие альтернативы зависят от вашей текущей архитектуры и зависимостей.Если у вас есть планы на RxJava, можете сослаться на это

https://www.google.com.sg/search?q=auto+complete+with+rx+java&oq=auto+complete+with+rx+java&aqs=chrome..69i57.6944j0j7&sourceid=chrome&ie=UTF-8

...