May 25, 2018 updates: Privacy Policy

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

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

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

  1. public class ReuseModelListDataProvider<T extends Serializable> extends ListDataProvider<T>{
  2. private static final long serialVersionUID = -4848228362992249051L;
  3. Map<T, IModel<T>> modelMap = new HashMap<T, IModel<T>>();
  4. public ReuseModelListDataProvider(List<T> list) {
  5. super(list);
  6. }
  7. @Override
  8. public IModel<T> model(T object) {
  9. IModel<T> model = modelMap.get(object);
  10. if(model == null) {
  11. model = new Model<T>(object);
  12. modelMap.put(object, model);
  13. }
  14. return model;
  15. }
  16. /**
  17. * Modelのキャッシュを破棄するときにはこれを呼ぶ
  18. */
  19. public void clearModelCache() {
  20. modelMap = new HashMap<T, IModel<T>>();
  21. }
  22. }