0

GridView のカスタム アダプターを使用して、カスタム データ クラスの ArrayList を供給しています。

アイデアは、ユーザーが項目を (+) 押すとその番号が上がり、(-) を押すと番号が下がるというものです。

これは、次のコードで完全に機能しました。

アクティビティ:

//playerLayouts is the ArrayList of my Player class.
playerLayouts.get(position).changeLife(-1); //All this does is decrement life by 1.
adapter.notifyDataSetChanged();

アダプタ:

holder.textLife = (TextView) row.findViewById(R.id.player.text_life);
...
holder.textLife.setText(Integer.toString(player.life));

したがって、これはうまく機能します。プラスを押すと上がり、マイナスを押すと下がります。すべては順調です。

しかし、1 が減算されたことを示す小さな "-1" ポップアップをビューに配置して、ビューをアニメーション化すると、問題が発生します。

...
//textLifeChange is a different TextView in the layout. Also, I'm using NineOldAndroids.
textLifeChange.setText(Integer.toString(player.lifeChange));
animate(holder.textLifeChange).setDuration(2000).alpha(0); //There are a few more animations in addition to this one.

基本的に、アニメーションの再生中 (2 秒間) はいつでも、ビューはそれ以上更新を行いません。

たとえば、「ライフ」= 20 とします。(-) を押すと、19 と表示され、小さなポップアップに「-1」と表示され、フェードアウトします。そして、そのわずか1秒後にまた(-1)を叩きました。何も起こりません。「人生」の TextView はまだ 19 と表示されており、ポップアップはアニメーションを変更せずに再生し続けます。もう 1 秒待つと、アニメーションが終了します。(-)をもう一度押すと、再び正しく更新されます。

興味深いことに、setTextメソッドをログに記録すると、正しい番号で更新され、呼び出されていることがgetViewわかりますが、目に見えて更新されていません。

どうしたの?

4

1 に答える 1

1

あなたのアニメーションがUIスレッドを占有しているため、インターフェイスの他の部分の変更が妨げられていると思います. この回答は次のことに役立ちます。

Android: アニメーションの開始を妨げるスレッドの実行

于 2012-12-21T13:57:20.720 に答える