データベースからの情報を表示するカスタム アダプターを備えた ListView があります。アプリを起動すると、データベースからデータが読み取られ、アダプターに渡され、ListView にアタッチされます。LayoutAnimationController が ListView で実行され、コンテンツがスムーズに表示されます。
this._lvList = (ListView)_v.findViewById(R.id.lvList);
this._lvList.setAdapter(new TableAdapter(getActivity(),R.layout.tablerow,Category.getCategories()));
LayoutAnimationController lac = new LayoutAnimationController(AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_left));
lac.setDelay(0.2f);
this._lvList.setLayoutAnimation(lac);
this._lvList.startLayoutAnimation();
全く問題無い。
ListView の任意のエントリをクリックすると、クリックされていないエントリが消え、クリックされたエントリがリスト内の唯一のエントリになり、予想どおり上部に表示されます。
View v;
for(int i = 0;i<_lvList.getChildCount();i++) {
v = this._lvList.getChildAt(i);
if(v!=clickedView) {
Animation animSlideOut = AnimationUtils.loadAnimation(getActivity(), i%2==0?R.anim.slide_out_left:R.anim.slide_out_right);
animSlideOut.setStartOffset(i*50);
// some more stuff
}
v.startAnimation(animSlideOut);
}
これも同様に機能しますが、問題は、その 1 つのリスト エントリをもう一度クリックすると、リストが再作成され、すべての項目が再び表示されることです。
アプリの起動時に問題なく動作するので、最初(最初のスニペット)からコードを使用できると思っていましたが、今回は…そうではありません。アニメーションは発生しません。その理由は、ListView でアニメーション化するビューがないためです (前のステップのビューを除く)。
新しい Tableadapter を作成する代わりに、私はすでにそれをクリアしようとしましたが、notifyDataSetChanged() と呼ばれる新しいものを埋めようとしました...
_lvList.getChildCount();
stills は 1 つのビューを返しますが、アダプターは 18 のエントリすべてを保持します。私もやってみました
requestLayout();
forceLayout();
invalidate();
invalidateViews();
アニメーションの前にListViewに強制的に子ビューを生成させますが、機能していません。そのため、レイアウト アニメーションを呼び出した後、ListView が即座に表示されます。
概要 : 私の ListView には、レイアウト アニメーションの開始前に子ビューが含まれていません。強制的に生成するにはどうすればよいですか?
事前にThx :)