Калитка: ListView - пропуск элемента - PullRequest
4 голосов
/ 05 января 2011

возможно ли пропустить элемент в populateItem()?например, установив что-то в компоненте элемента или что-то еще.

ListView view = new ListView("quickLinks", quickLinks) {
    @Override
    protected void populateItem( ListItem item ){
        if( item.getModel(). /*something*/ )
                    item.skip()
    }
};

Спасибо

Ответы [ 3 ]

10 голосов
/ 05 января 2011

Я бы предпочел фильтровать мою модель вместо выполнения проверки if / else в представлении.

Здесь используйте этот абстрактный класс:

public abstract class FilteredListModel<K> extends LoadableDetachableModel<List<K>>{

    private static final long serialVersionUID = 1L;
    private IModel<List<? extends K>> inner;

    @Override
    protected void onDetach(){
        inner.detach();
    }

    public FilteredListModel(IModel<List<? extends K>> inner){
        this.inner = inner;
    }
    public FilteredListModel(List<? extends K> inner){
        this.inner = Model.ofList(inner);
    }

    @Override
    protected final List<K> load(){
        List<? extends K> input = inner.getObject();
        List<K> result = new ArrayList<K>(input.size());
        for(K k : input){
            if(accept(k))result.add(k);
        }
        return result;
    }

    protected abstract boolean accept(K k);
}

Теперь оберните в него свою модель списка:

ListView<String> view = new ListView<String>(
    "quickLinks",
    new FilteredListModel<String>(quickLinks){

      protected boolean accept(String value){
          return yourCheckHere();
      }

    }) {

    @Override
    protected void populateItem( ListItem<String> item ){
        // no ifs here
    }
};
2 голосов
/ 05 января 2011

Не будет item.setVisible(false) работать?

1 голос
/ 05 января 2011

Вы можете переопределить метод iterator() в вашем ListView, чтобы выполнить итерацию только элемента, который вы хотите визуализировать.

...