Подтвердить что ты не робот

Объяснение метода getView() для ArrayAdapter

Не могли бы вы объяснить метод getView() для ArrayAdapter.

Я прочитал документы и имеет три параметра:

  • position: позиция элемента в наборе данных адаптера элемент, который мы хотим видеть.
  • convertView: старый вид повторного использования, если это возможно. Примечание. Перед использованием убедитесь, что это представление не имеет значения null и соответствующего типа. Если невозможно преобразовать это представление для отображения правильных данных, этот метод может создать новое представление.
    Гетерогенные списки могут указывать их количество типов просмотра, поэтому этот вид всегда имеет правильный тип (см. GetViewTypeCount() и getItemViewType (int)).
  • parent: родительский элемент, который в конечном итоге будет привязан к

Я понял параметр position. Как они сказали, это подразумевает позицию предмета, который был запрошен.

Откуда convertView. Я видел много примеров, где они проверяют, является ли convertView нулевым. Если is равно null, они раздувают новый экземпляр макета строки, заполняют его и возвращают. Наверное, я тоже обнял это, но одна вещь все еще меня озадачивает. Каков макет, который передается через параметр convertView. Если параметр resource, который передается при инициализации ArrayAdapter? Является ли кэшированная копия последнего макета, возвращаемого getView()?

И наконец. Что делает параметр parent. Я не видел слишком много примеров, использующих это. Большинство из них просто повторно используют/раздувают компоновку строк и возвращают ее.

(Я спрашиваю, потому что у меня есть анимация с кликом в моем ListView. В частности этот, который предназначен для репликации меню быстрого выпадающего списка Spotify Моя анимация была немного вялой. После некоторой диагностики этой проблемы я понял, что это связано с тем, что мой метод getView() занимает немного времени, чтобы завершить, когда я раздуваю новый вариант строки на каждой итерации. Кто-то предложил кэшировать макет строки в ViewHolder, в то время как другие примеры указывают на повторное использование параметра convertView, то есть только раздувание макета строки, если convertView равно null.)

4b9b3361

Ответ 1

Is - это кешированная копия последнего макета, возвращаемого getView()?

convertView - это вид строки, которая покинула экран (так что это не последний вид, возвращаемый методом getView). Например, сначала отображается список, в этом случае convertView - null, ранее не было построено представление строки и оставлено на экране. Если вы прокрутите вниз, строка 0 покинет экран (больше не будет виден), когда это произойдет, ListView может выбрать сохранение этого представления в кеше, чтобы впоследствии использовать его (это имеет смысл, поскольку строки ListView обычно имеют один и тот же макет, только с разными данными). Причина сохранения некоторых представлений в кеше и последующего использования их заключается в том, что метод getView можно было бы назвать много раз (каждый раз, когда пользователь прокручивает вверх/вниз и появляются новые строки на экране). Если каждый раз, когда представление строки должно быть воссоздано, это привело бы к созданию множества объектов, которые следует избегать. В вашем методе getView вы должны проверить convertView, чтобы увидеть, есть ли он null. Если он null, то вы должны построить новое представление строки и заполнить его данными, если это не null, ListView предложило вам предыдущее представление. Наличие этого предыдущего представления означает, что вам не нужно создавать новый макет строки, вместо этого вы должны заполнять его правильными данными, поскольку в этом кэшированном представлении есть старые данные, все еще привязанные к нему (вы увидите много вопросов о stackoverflow, где пользователи спрашивают, почему строки их ListView дублируются при прокрутке вниз).

Что делает родительский параметр. Я не видел слишком много примеров используя это. Большинство из них просто повторно используют/раздувают макет строки и верните его.

Он должен использоваться для получения правильного LayoutParams для вновь надутой/построенной строки. Например, если вы раздуваете макет с RelativeLayout в качестве корня, и вы не используете parent для получения LayoutParams, у вас могут возникнуть проблемы с макетом строк. Чтобы взять родителя, вы должны использовать:

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false);

Ответ 2

Мое понимание convertView заключается в том, что он по существу рассматривает, что был переработан, потому что они не используются в данный момент - например, вы прокручиваете список вниз, те, что наверху, не отображаются на экране, поэтому они передаются в этот параметр для использования, когда вам нужно новое представление (так что вам не нужно создавать совершенно новый, а неиспользуемые - сидеть без дела). iOS имеет аналогичный метод под названием dequeueReusableCellWithIdentifier. Если каждая строка вашего списка имеет одинаковую структуру, безопасно применять ее к соответствующему типу и просто обновлять информацию в нем - текст, изображения и т.д. Это будет представление, которое ранее возвращалось вызовом getView() для тот же список.

Моя лучшая догадка (и это, по общему признанию, догадка) с parent заключается в том, что это представление, что этот список адаптеров является дочерним. Он возвращает вам путь к системе рендеринга, если вам нужен контекст, доступ к системе ресурсов, для передачи информации или получения информации из родительского представления списка.