实施AutoCompleteTextView的更好解决方案?

时间:2018-06-25 21:44:36

标签: android filter autocomplete

我正在努力实现一种解决方案,以在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 :(得分:0)

肯定有很多方法可以改善解决方案。  1.消除抖动的因素,以减少UI重绘。

代码示例和其他替代方法取决于您当前的体系结构和依赖性。如果您有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