14

一連のメモを含む ListView があります。

現在、リストが最初にロードされたときに、レイアウト アニメーションを使用して、すべてのメモを横からスライドさせます。これは完全に機能します。

ただし、特定のポイントより下のリスト項目にのみレイアウト アニメーションを適用する方法を理解しようとしています。リスト上のアイテムを削除するとします。その下のすべてのアイテムを、削除されたメモの古い場所に移動したいと思います。

子インデックスによってアニメーションの遅延または補間をカスタマイズする方法を見つけようとしましたが、この場所に適したものは見つかりませんでした。カスタム レイアウト アニメーション (LayoutAnimationController の拡張など) を使用してこれを行う方法はありますか? または、この低レベルで各ビューを個別にアニメーション化する必要がありますか?

助言がありますか?

4

3 に答える 3

1

非常によく似た問題がありView、レイアウト アニメーション コントローラーを使用して指定したビューのみをアニメーション化できる単純なサブクラスで解決策を見つけることができました。このリンクを参照してください:

LayoutAnimationController は指定されたビューのみをアニメーション化できますか

于 2012-10-05T09:38:47.250 に答える
1

アニメーションを作成し、リストで呼び出しますOnItemClickListener。その後、アダプタを使用しnotifyDataSetChangedてリストの内容を更新できます。

この例でremoveListItemは、削除する行とリスト コンテンツ配列内のその行の位置を受け取る with というメソッドを作成しました。

public class MainActivity extends ListActivity implements OnItemClickListener{

ArrayList<String> values;
ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    values = generateMockData(50);

    adapter = new ArrayAdapter<String>(
            this, android.R.layout.simple_list_item_1, values);

    setContentView(R.layout.activity_main);

    getListView().setAdapter(adapter);
    getListView().setOnItemClickListener(this);
}

private ArrayList<String> generateMockData(int number) {

    ArrayList<String> result = new ArrayList<String>();

    for(int i = 0; i < number; i++)
        result.add(""+i+" "+ (int)Math.random() * 13);

    return result;
}

private void removeListItem(View rowView, final int positon) {

    Animation anim = AnimationUtils.loadAnimation(this,
            android.R.anim.slide_out_right);
    anim.setDuration(500);
    rowView.startAnimation(anim);

    new Handler().postDelayed(new Runnable() {

        public void run() {

            values.remove(positon);//remove the current content from the array

            adapter.notifyDataSetChanged();//refresh you list

        }

    }, anim.getDuration());

}

public void onItemClick(AdapterView<?> arg0, View row, int position, long arg3) {

       if(position == YOUR_INDEX) //apply your conditions here!
          removeListItem(row,position);
}
于 2012-09-27T11:23:34.650 に答える
0

レイアウト xml に、次を追加してみてください。

<ListView  
  android:id="@android:id/list"
  ... 
  android:animateLayoutChanges="true"/>  

これにより、リストビューからの挿入と削除が自動的にアニメーション化されます。
anim_translate_left という名前のカスタム アニメーションがある場合は、代わりに次を使用します。

<ListView  
  android:id="@android:id/list"
  ... 
  android:animateLayoutChanges="@anim/anim_translate_left"/>   

出典:Google API

于 2013-03-18T19:54:01.983 に答える