ソース表示: ListDataProviderのmodel()メソッドが、同じModelObjectに対しては同じModelを返すようにするには #54216

== !ListDataProviderのmodel()メソッドが、同じ!ModelObjectに対しては同じModelを返すようにするには

 !ListDataProviderのmodel()メソッドは、毎回新しいModelインスタンスを作成します。そのため、!GridViewや!DataViewにsetにおいてsetItemReuseStrategy(!ReuseIfModelsEqualStrategy.getInstance())を呼び出しても、Modelが毎回異なるため、Itemの再利用が行われません。

 次のように!ListDataProviderを拡張すれば、同じModelインスタンスが使われるでしょう。

{{{ code java
public class ReuseModelListDataProvider<T extends Serializable> extends ListDataProvider<T>{
    private static final long serialVersionUID = -4848228362992249051L;

    Map<T, IModel<T>> modelMap = new HashMap<T, IModel<T>>();

    public ReuseModelListDataProvider(List<T> list) {
        super(list);
    }

    @Override
    public IModel<T> model(T object) {
        IModel<T> model = modelMap.get(object);
        if(model == null) {
            model = new Model<T>(object);
            modelMap.put(object, model);
        }
        return model;
    }
}
}}}