ArrayAdapter для флага страны и счетчика изображений, замедляющих просмотр

У меня следующий класс:

    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;
    }
}

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

Ben P. 11.10.2018 18:49

Привет @BenP. спасибо за указатели, обязательно попробую. Я также обновил вопрос, чтобы предоставить более старый и теоретически менее эффективный фрагмент кода, однако он не вызывает задержки пользовательского интерфейса ...

davy307 11.10.2018 18:58

Хм. Звучит так, будто виновником может быть AdapterImageView. Возможно, у написанного вами специального кода есть неожиданные побочные эффекты.

Ben P. 11.10.2018 18:59

Ха-ха, нет, раньше он был намного медленнее, AdapterImageView немного ускорил его, но он все равно намного медленнее, чем исходный фрагмент кода! confused.com

davy307 12.10.2018 10:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
111
0

Другие вопросы по теме