Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

Повторение Item в ListView (CustomAdapter)

#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 по этому примеру.

Комментариев нет:

Отправить комментарий