Comments 8
Я позволю себе немного покритиковать.
Вы решили очень частную задачу и код совсем не универсален, мне кажется для статьи это не очень хорошо. Хорошо бы дать возможность отдавать свой адаптер и тогда при использовании можно было бы выводить не только одно текстовое поле, но и картинки например. Размер менять с помощью view.setScaleX(). Это было бы куда более гибко и интересно для остальных.
Кроме того, задание setTextSize при скролле — долго. setScale было бы немного быстрее. setTextSize требует измерения текста каждый раз, потом измерения view и т.д. Делать это на каждый пиксель скролла не очень производительно.
Из статьи так и не понял, зачем наследоваться от LinearLayout, а не сразу от ListView (ну или в крайнем случае FrameLayout). Лишний элемент в иерархии не очень хорошо.
Хранить все view в массиве — не нужно. listView.getViewAt(int) — вернет те же самые View.
Как-то попахивает костылем.
В целом как решение узкой задачи хорошо, но выкладывать я бы не стал, очень уж тяжело переиспользовать и много не оптимальных путей.
Вы решили очень частную задачу и код совсем не универсален, мне кажется для статьи это не очень хорошо. Хорошо бы дать возможность отдавать свой адаптер и тогда при использовании можно было бы выводить не только одно текстовое поле, но и картинки например. Размер менять с помощью view.setScaleX(). Это было бы куда более гибко и интересно для остальных.
Кроме того, задание setTextSize при скролле — долго. setScale было бы немного быстрее. setTextSize требует измерения текста каждый раз, потом измерения view и т.д. Делать это на каждый пиксель скролла не очень производительно.
Из статьи так и не понял, зачем наследоваться от LinearLayout, а не сразу от ListView (ну или в крайнем случае FrameLayout). Лишний элемент в иерархии не очень хорошо.
Хранить все view в массиве — не нужно. listView.getViewAt(int) — вернет те же самые View.
Для того, чтобы можно было сдвинуть первый элемент списка в середину добавим в начало и конец массива пустые строки.
Как-то попахивает костылем.
В целом как решение узкой задачи хорошо, но выкладывать я бы не стал, очень уж тяжело переиспользовать и много не оптимальных путей.
Правильным архитектурным решением было бы расширить ListView, который снаружи вел себя так же как обычные. Т.е. ему можно было бы передать любой адаптер, наследуемый от BaseAdapter. Вся реализация внутри одного класса, наследуемого от ListView.
Не портить адаптер фиктивными элементами, а делать нужные отступы внутри listView, в крайнем случае делать wrapper над адаптером.
Работать исключительно с View, что бы не зависеть от того, что возвращает адаптер (картинки, кнопки или текст).
Параметризировать количество элементов, скорость уменьшения элементов и т.д. что бы можно задать из xml и из кода.
Увеличивать и уменьшать элементы в onDraw, что бы при скроле не пересчитывать весь layout. В крайнем случае, если необходимо смещать элементы — то еще onLayout переписать.
Не портить адаптер фиктивными элементами, а делать нужные отступы внутри listView, в крайнем случае делать wrapper над адаптером.
Работать исключительно с View, что бы не зависеть от того, что возвращает адаптер (картинки, кнопки или текст).
Параметризировать количество элементов, скорость уменьшения элементов и т.д. что бы можно задать из xml и из кода.
Увеличивать и уменьшать элементы в onDraw, что бы при скроле не пересчитывать весь layout. В крайнем случае, если необходимо смещать элементы — то еще onLayout переписать.
Большое спасибо за критику, одной из целей написания статься было как раз узнать взгляд со стороны и идеи, которые могут помочь улучшить компонет и сделать его более универсальным.
По поводу наследования от LinearLayout. Я как раз хотела, чтобы компонет был более менее законченным, и из внешнего кода не было доступа к ListView — можно было бы передавать только определенные настройки — ну собственно говоря сам массив строк, xml — атрибуты, количество видимых элементов.
Насчет фиктивных элементов — да, слегка костыль. Но это добавление происходит прям внутри компонента и никаких манипуляций с массивом из внешнего кода не требуется — индексы и выбранные элементы компонент возвращает правильно. Я просто пытаюсь оправдаться, так как это был самый простой способ решения задачи
Я буду делать компонент более универсальным, но тем не менее мне кажется, что несколько удачных решений в этой версии уже есть и кому то это может пригодится
По поводу наследования от LinearLayout. Я как раз хотела, чтобы компонет был более менее законченным, и из внешнего кода не было доступа к ListView — можно было бы передавать только определенные настройки — ну собственно говоря сам массив строк, xml — атрибуты, количество видимых элементов.
Насчет фиктивных элементов — да, слегка костыль. Но это добавление происходит прям внутри компонента и никаких манипуляций с массивом из внешнего кода не требуется — индексы и выбранные элементы компонент возвращает правильно. Я просто пытаюсь оправдаться, так как это был самый простой способ решения задачи
Я буду делать компонент более универсальным, но тем не менее мне кажется, что несколько удачных решений в этой версии уже есть и кому то это может пригодится
Мне кажется, будь это ListView, это был бы тоже законченный элемент. В него можно было бы передавать любой свой адаптер со своими View и это было бы очевиднее. Разработчик знает что такое AdapterView и как с ним работать, а вот то что нельзя поставить иконки — может оказаться фатальным недостатком.
Вы такой замкнутостью компонента ломаете модель, на которой android построен. Компонент должен отвечать за отображение данных, но не ограничивать их тип.
Что бы избежать добавления элементов и избавиться от запаха приспособления для инвалидов, можно добавлять paddingTop у listView при скролле дальше первого элемента.
Вы такой замкнутостью компонента ломаете модель, на которой android построен. Компонент должен отвечать за отображение данных, но не ограничивать их тип.
Что бы избежать добавления элементов и избавиться от запаха приспособления для инвалидов, можно добавлять paddingTop у listView при скролле дальше первого элемента.
Для достижения такого эффекта в ListView можно поглядеть вот эти примеры: 3D ListView и Overlaped ListView
Sign up to leave a comment.
Создание нестандартного компонента на основе ListView