#getview #android #listview #java
Здравствуйте! Делаю вывод ListView, всё хорошо до момента пока ListView не становится длинным и появляется скролл. На экран помещается 13 строк, я пролистываю его дальше и элементы начинают повторяться: Вот после 13 должно идти дальше до 30. В Адаптере это выглядит так: @Override public View getView(int position, View convertView, ViewGroup parent) { View v; String str = items.get(position); if (convertView == null) { v = LayoutInflater.from(contextAdapter).inflate(R.layout.test_item, parent, false); TextView tvText = (TextView) v.findViewById(R.id.test_item_text); TextView tvText2 = (TextView) v.findViewById(R.id.test_item_text_2); if (tvText != null) tvText.setText("str:" + str); if (tvText2 != null) tvText2.setText("position:" + position); } else { v = convertView; } return v; } Если я вынесу из if кусок с поиском элементов в лэйауте, то всё будет почти хорошо: @Override public View getView(int position, View convertView, ViewGroup parent) { View v; String str = items.get(position); if (convertView == null) { v = LayoutInflater.from(contextAdapter).inflate(R.layout.test_item, parent, false); } else { v = convertView; } TextView tvText = (TextView) v.findViewById(R.id.test_item_text); TextView tvText2 = (TextView) v.findViewById(R.id.test_item_text_2); if (tvText != null) tvText.setText("str:" + str); if (tvText2 != null) tvText2.setText("position:" + position); return v; } Но проблема в том, что каждый раз, когда я листаю список, он перестраивает ВСЕ видимые на данном экране элементы. Как сделать так, что бы он 1 раз сделал рендер итема, а потом брал из "сохраненных"?
Ответы
Ответ 1
почитайте про паттерн ViewHolder здесь (п 6.3. Holder Pattern)Ответ 2
Так и хочется сказать как в известной басне... В getView() должна использоваться концепция тегов, то есть в создаваемую View надо пихать т.н. тег/объект посредством View.setTag() и когда приходит ненулевой convertView извлекать оттуда объект через View.getTag() и выставлять объекту (в данном случае виджетам) нужные значения. Тогда не нужно будет каждый раз пересоздавать виджеты или наоборот работать с одним виджетом который и будет двоиться, троиться. См. например здесь глава 6.4. P.S. Да, @Роман Захаров примерно об этом же и пишет...Ответ 3
В моем случае я бы посоветовал не читайть эти ответы. Выкиньте все что вы сделали и сделайте ListView по этому примеру.
Комментариев нет:
Отправить комментарий