我正在努力实现一种解决方案,以在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();
}
};
}
一些链接或评论可能对我有很大帮助,以帮助您了解该解决方案是否可以在任何方面进行改进。
答案 0 :(得分:0)
肯定有很多方法可以改善解决方案。 1.消除抖动的因素,以减少UI重绘。
代码示例和其他替代方法取决于您当前的体系结构和依赖性。如果您有RxJava的计划,可以参考此