У меня следующий класс:
private class CountryAdapter extends ArrayAdapter<String> {
private LayoutInflater inflater;
CountryAdapter(Context context, int textViewResourceId, ArrayList objects) {
super(context, textViewResourceId, objects);
inflater = getLayoutInflater();
}
@Override
public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) {
return getCustomDropdown(position, convertView, parent);
}
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
View getCustomDropdown(int position, View convertView, ViewGroup parent) {
DropViewHolder dropViewHolder;
if (convertView == null) {
dropViewHolder = new DropViewHolder();
convertView = inflater.inflate(R.layout.country_spinner_row, parent, false);
convertView.setTag(dropViewHolder);
dropViewHolder.label = convertView.findViewById(R.id.spinner_countryNameRow);
dropViewHolder.icon = convertView.findViewById(R.id.spinner_countryFlagRow);
} else {
dropViewHolder = (DropViewHolder) convertView.getTag();
}
dropViewHolder.label.setText(String.format("%s (+%s)", countryNameList.get(position), countryList.optJSONObject(position).optString("phoneCountryCode")));
String flagPath = "flag_" + countryList.optJSONObject(position).optString("countryCode").toLowerCase();
dropViewHolder.icon.setImageResource(getResources().getIdentifier(flagPath, "drawable", getPackageName()));
return convertView;
}
View getCustomView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.country_spinner_row_dropdown, parent, false);
convertView.setTag(viewHolder);
viewHolder.icon = convertView.findViewById(R.id.spinner_countryFlagRow);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String flagPath = "flag_" + countryList.optJSONObject(position).optString("countryCode").toLowerCase(); viewHolder.icon.setImageResource(getResources().getIdentifier(flagPath, "drawable", getPackageName()));
return convertView;
}
private class DropViewHolder {
TextView label;
AdapterImageView icon;
}
private class ViewHolder {
AdapterImageView icon;
}
}
Я думаю, что он соответствует всем стандартам для ArrayAdapter, повторного использования представлений и т. д. Однако при открытии клавиатуры представление перерисовывается и происходит значительная задержка при обновлении положения кнопок.
Есть ли что-то явно очевидное, что мне не хватает?
Заранее спасибо :)
Обновлено: для большей ясности AdapterImageView - это просто класс, который расширяет ImageView и отменяет requestLayout без вызова super, чтобы предотвратить дорогостоящие перерисовки.
EDIT2: Напротив, этот фрагмент кода, который старше и теоретически хуже работает, не отстает от пользовательского интерфейса.
public class CountryAdapter extends ArrayAdapter<String> {
public CountryAdapter(Context context, int textViewResourceId, ArrayList objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View row = inflater.inflate(R.layout.country_spinner_row, parent, false);
TextView label = (TextView) row.findViewById(R.id.spinner_countryNameRow);
label.setText(countryNameList.get(position).toString());
ImageView icon = (ImageView) row.findViewById(R.id.spinner_countryFlagRow);
String flagPath = "flag_" + countryList.optJSONObject(position).optString("countryCode").toLowerCase();
icon.setImageResource(getResources().getIdentifier(flagPath, "drawable", getPackageName()));
return row;
}
}
Привет @BenP. спасибо за указатели, обязательно попробую. Я также обновил вопрос, чтобы предоставить более старый и теоретически менее эффективный фрагмент кода, однако он не вызывает задержки пользовательского интерфейса ...
Хм. Звучит так, будто виновником может быть AdapterImageView. Возможно, у написанного вами специального кода есть неожиданные побочные эффекты.
Ха-ха, нет, раньше он был намного медленнее, AdapterImageView немного ускорил его, но он все равно намного медленнее, чем исходный фрагмент кода! confused.com




Три вещи в вашем коде выглядят так, как будто они мог медленные. (1) доступ к json для получения названия страны флага каждый раз, (2) использование
getResources().getIdentifier()вместо прямого доступа кR.drawable.fooи (3) установка изображения для просмотра изображения. Попробуйте рассчитать время для каждого из этих действий и посмотреть, не займет ли какое-нибудь больше миллисекунды.