2013-06-28 11 views
9

私は立ち往生していますが、どこの場所でも解決策を見つけることができませんでした。 :(現在表示されているリストビューの項目でアニメーションが開始されない

IはBaseAdapterによって提供される私のリストビューの各項目の私のレイアウト(GridViewの)内部ImageViewのを有する。 画像がロードされ、Iは

imageView.setImageDrawable(newImage); 
を用いImageViewのにロードBitmapDrawableを割り当てます

アイテム私は、簡単なアニメーションを割り当てることによってTransitionDrawable ORを使用して、新しいBitmapDrawableを割り当てた場合、何の問題もなく

をポップアップしかし:。

//this is inoperative - animation will not start for currently displayed items! No solution found :(
Animation a = LibResource.getResourceAnimation(activity, R.anim.fade_in); 
imageView.setImageDrawable(newImage); 
imageView.startAnimation(a); 

私のGridViewの現在表示されている項目のアニメーションが開始されません。 GridViewを下にスクロールして、上記の項目にスクロールすると、画像が表示され、アニメーションが実行されました!

私はすでに次の修正しようとしました:私もアニメーションを割り当てた後、次のステートメントを試してみた

imageView.invalidateDrawable(newImage); 
imageView.invalidate(); 

を - もちろん、私は割り当て、起動した後、UIスレッド上でそれらを呼ばれますアニメーションON UI-THREAD:

myGridView.invalidate(); 
myGridView.invalidateViews(); 
myGridView.getAdapter().notifyDataSetChanged(); 

前述したように、この問題は、ListView内の見えるアイテムに対してのみ発生します。

アニメーションまたはトランジションドラブルは、関連するすべてのビューでinvalidate()などを呼び出した後でも、開始しないのはなぜですか?

XPeria-Arc-S(APIレベル10)およびAndroidエミュレータAPIレベル8,9,10で問題が発生します。これはAndroidシステムのバグですか?

ご協力いただければ幸いです!事前に

おかげ

クリストファー


[OK]を - あなたの迅速な応答をありがとう。

私は、これは私の問題を解決しなかったことをポイントに来た:(問題を持って、仕事に、このために私のコードの構造を再編成の多くの時間後、 。このほかに

、そうではありません私は、ビューの作成時に内容を変更するために、適用または非常に実用的。たぶん、あなたはこの問題に関して、他のソリューションを持っている?

敬具

クリストファー

答えて

6
  1. 次回ビューを要求されると、ビューにアニメーションを付けるようにアダプタに指示します。
  2. invalidateViews()を呼び出します。
  3. getViewがアダプタ作成ビューで呼び出され、それをアニメートすると、
1

私はこの問題を解決しました。

このアニメーションをこのアイテムの参照先のコンポーネントに割り当てると、現在表示されているListView/GridViewアイテムのビューでのアニメーションの開始は機能しません。

代わりに、GridViewの

myGridView.invalidateViews()

を無効にし、応じ

getViewメソッド()接続BaseAdapterの

方法でアニメーションを開始する必要があります。

このメソッドはシステムによって頻繁に呼び出されますが、通常はすべてのビューをキャッシュするメカニズムを使用します。したがって、特定の項目でアニメーションを開始する場合は、ビューを再作成するだけで、myGridView.invalidateViews()を呼び出した後にシステムがgetView()を呼び出すと、アニメーションが正しく開始されます。

有用な回答を削除したユーザーに感謝します。クリストファー

+1

私は元の回答を元に戻しました。 –

+0

ありがとうございました! :) 私はすぐに成功しないようにこの仕事をするためにすぐに私のコードのすべてを再編成することができませんでしたが、これは間違いなくそれを行う正しい方法です! :D –

0

は、これは私がそれを解決することができた方法です

ご挨拶。 GridViewのメッセージキューへのポスティングによって変更されたデータセットを通知することで、GridViewのすべての処理が完了した後に 'notifyDataSetChanged'が呼び出されます。

myGridView.post(new Runnable() { 
    public void run() { 
    myGridView.notifyDataSetChanged(); 
    } 
}); 
0

android:animateLayoutChanges="true"を問題を解決するために追加します。

<ListView 
    android:id="@+id/list_view" 
    android:animateLayoutChanges="true" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 
関連する問題