harukazepc’s blog

インターネッツとAndroidなどが大好きです。あとは日々のことなど。

TableViewで落ちることがあったら、まずclassName設定を疑うべし! #titaniumjp

Titanium製のAndroidアプリで、TableViewで頻繁に落ちる事がたまに起こります。
たとえばこんなエラー

java.lang.ClassCastException: ti.modules.titanium.ui.LabelProxy cannot be cast to ti.modules.titanium.ui.ImageViewProxy
at ti.modules.titanium.ui.widget.TiUIImageView.setProxy(TiUIImageView.java:202)
...

原因として、やたらTableViewRowを更新しているとか、スクロールの処理がトリガーになってるとか、いろんなのを探ってしまうけど、意外な盲点が。

TableViewRowのclassName指定によって落ちるのです。

classNameは、TableViewRow内で同じレイアウト/子要素を持つ場合、同じclassNameを指定する事で参照のパフォーマンスがあがる、という設定値とのことです。

var row1 = Ti.UI.createTableViewRow({
  width:Ti.UI.FILL, height:Ti.UI.SIZE,
  className:'rowPattern1'
});
row.add(Ti.UI.createLabel({text:'hello'}));

var row2 = Ti.UI.createTableViewRow({
  width:Ti.UI.FILL, height:Ti.UI.SIZE,
  className:'rowPattern1'
});
row.add(Ti.UI.createLabel({text:'hello'}));

...

ですが、

  • 違うレイアウト/子要素なのに同じclassName
  • 同じレイアウト/子要素でも、途中で更新されてしまう(各設定値の変更でも影響する?

といった時に、上述のClassCastExceptionとなるようです。

自分も何度か出会って困る事多いので備忘録。

© harukazepc️