Загрузка списка при прокрутке - PullRequest
1 голос
/ 05 апреля 2011

У меня проблема с приложением, которое отображает список документов, используя ListView: Текущий дизайн следующий:

  • ListView создается с nr элементов = nrOfdocuments / 50;ListView добавляется в скроллер

  • для каждого элемента этого ListView создается новая панель Пакет (которая представляет пакет документов - максимум 50 документов);

  • этот пакетный класс создает еще один ListView с максимум 50 элементами (каждый элемент представляет панель с деталями документа - элементы загружаются только при достижении прокрутки)

Например: - для общего количества 1000 документов: будет создано 20 объектов типа Batch => Будет создано 20 объектов ListView

Проблема заключается в том, что при попытке загрузить большое количество документов(> 10000) завершится исключением из-за недостатка памяти в Java.Я хочу улучшить этот дизайн, сохранив только один пакет, загруженный в память один раз (таким образом, максимум 50 документов), и очистить все другие ранее созданные объекты ListView, которые больше не используются.У вас есть идеи, которые могут мне помочь?

Ответы [ 4 ]

1 голос
/ 05 апреля 2011

Вы можете загрузить только 3 партии:

  • Одна партия до текущей партии
  • Текущая партия
  • Партия после текущей партии

Когда пользователь прокручивает список вверх / вниз, вы можете загрузить только эти три партии (когда пользователь вводит другую партию, перезагрузите партии с партией, введенной в качестве новой текущей партии).

Чтобы полоса прокрутки отображалась так, как если бы список был заполнен старыми партиями, просто вставьте пустые партии с пустыми документами, например

  • Пустая партия 1
  • Пустая партия 2
  • Одинпартия перед текущей партией
  • текущая партия
  • партия после текущей партии

Единственная проблема, с которой вы столкнетесь, - это если пользователь быстро выполнит поиск спискадо того, как Аякс успеет перезагрузить партии.Это не может быть легко решено, но пользователю может быть сообщено, что данные загружаются, если фиктивные партии отображают сообщение о загрузке для каждой записи документа.

0 голосов
/ 24 мая 2011
0 голосов
/ 07 апреля 2011

Это не просто ответ, связанный с калиткой, а скорее ответ на вопрос о вашем пользовательском интерфейсе.

Рассматривали ли вы использование master-detail шаблона пользовательского интерфейса?

Вместо одновременного ведения всей совокупности документов верхнего уровня и их дочерних документов, вы бы вместо этого представляли узлы верхнего уровня в списке и отображали только дочерние документы выбранного узла верхнего уровня в отдельной «детализации». Панель.

В калитке это довольно просто, с чем-то вроде события onClick, обновляющего модель панели подробностей (которая извлекает дочерние документы выбранного родителя).

0 голосов
/ 05 апреля 2011

Не уверен, что вы пытаетесь достичь ...

Хотите заменить текущие 50 документов новым набором из 50 документов или оставить старые для прокрутки?.

Если первое, то твой подход не похож на первый, о котором я бы подумал ...

private class MyPanel extends Panel {
    private ListView lv;

public MyPanel(String id) {
    super(id);
    List list = new ArrayList();
    lv = new ListView("lv", list) {

        @Override
        protected void populateItem(ListItem item) {
            //display the document
        }

    };

    add(lv);

    add(new AjaxButton("next", new Form("form")) {

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            //retrieve the next Batch
            List newList = new ArrayList();
            lv.setModelObject(newList);
            target.addComponent(MyPanel.this);
        }

    });
}

}

Что-то смутно подобное пришло бы мне в голову.Вы можете «прокручивать» взад-вперед, как раньше.

Кроме этого, я бы подумал о DataView вместо ListView, поскольку он поддерживает нумерацию страниц из коробки.

В качестве последней мысли, если вы просто удалите ссылки на свой ListView, не добавляя их (или любой окружающий контейнер, поскольку ретрансляторы не могут быть добавлены в AjaxRequestTargets), это даст gc возможность очистить эти объекты.но тогда вы должны позаботиться о нулевых ссылках при перезагрузке ...

...