1

アクティビティでは、サーバーからデータを取得しています。TableRowレイアウト xml ファイルで事前に定義された追加のビューを含む限られた数の があり、すべて に設定されていandroid:visibility="gone"ます。さらに、Java クラスにはこれらのすべての ID を持つ配列がありTableRowます。「データ入力」を入力するたびに、そのような を入力しTableRow、表示してアニメーション化します (アニメーションは、ランダムに選択された垂直方向からの「押し込み」です)。この質問の後半で重要になるさらなるヒントとして、サーバーから取得するすべてのデータ パケットは 1 か月に関連しています。

データを取得するたびに、次のプロセスを実行します

  1. まだ見えないTableRows に情報を入力します
  2. ステップ 1 が実行されるたびに、ブール配列の値がtrue
  3. 電話showAnimation()
  4. ブール配列で true であるすべてのエントリについて、id 配列のTableRowインデックスiを取得し、アニメーションを設定し、可視性を可視に設定します

これはうまくいきます。アニメーションを開始する前に可視性が設定されていても、アニメーションがすでに開始されているほど時間がかからないため、問題ではありません。

ここで問題が発生します。逆の方法は機能しません。明確にさせてください:私は、TableRowsがウィンドウから押し出され、目に見えないrespに設定されることを望んでいます。実際の月を変更するたびに、新しいエントリがプッシュされます。問題は、アニメーションが開始されるとすぐに、Views が非表示/削除に設定されることです。ここで最初の回答でAnimationListener説明したようなものでこれを解決しようとしました。これにより、次の 2 つの方法が考えられます。

  1. AnimationListenerそのようなfor eachを定義TableRowし、 で可視性を設定しonAnimationEnd()ます。これは動的ではないため、非常に醜いことがわかりました。
  2. の一種のインデックスにアクセスしAnimationListener、同じリスナーをすべてTableRowのアニメーションに設定します。ここで、これをどのように解決できるかわかりません。前に発見したように、アニメーションをViewループ (私の場合は for ループ) 内のセットに設定すると、アニメーションが設定されるたびにではなく、ループが終了したときにアニメーションが開始されます。そのため、その for ループでグローバル インデックス変数を使用して で使用したonAnimationEnd()としても、明らかに何も起こりません。

誰かがこれを実装するより良い方法を知っていますか? 新しいデータがサーバーから既に取得されている可能性があるため、新しいエントリが既に表示されている可能性があるため、 a で解決してもうまくいきHandler.postDelayed()ません (したがって、新しいエントリは非表示に設定されます)。

4

1 に答える 1

1

わかりました私はそれについてよく考えましたが、正直なところ、それが最も良い方法ではないことに同意しますが、フレームワークの制限により、最初の方法が依然として最良の方法です。

リスナーのコールバックから次のようにできると便利です:

public void onAnimationEnd (Animation animation){
    animation.getView().setVisibility(View.Visible);
}
// but this doesn't exist.

アニメーションを開始するように設定するたびに、次のことを確認してください。

Animation anim = row.getAnimation()
if(anim!=null){
     anim.setListener(null); // to avoid the listener to be called
     anim.cancel(); // to stop it from running
}
// and then go ahead and setup a new animation with new listener
anim = new MyAnimation();
anim.setListener(new SetToInvisibleListener());
row.startAnimation(anim);
于 2013-04-23T15:46:06.503 に答える