14

我有一个包含一系列笔记的 ListView。

目前,当列表首次加载时,我使用布局动画从侧面滑入所有笔记;这完美地工作。

但是,我试图弄清楚如何仅将布局动画应用于列出某个点以下的项目。假设我删除了列表中的一个项目:我希望它下面的所有项目都向上移动到已删除笔记的旧位置。

我尝试找到一种通过子索引自定义动画延迟或插值器的方法,但没有找到适合该位置的任何东西。有没有办法使用自定义布局动画(例如扩展 LayoutAnimationController)来做到这一点,还是我必须做这个低级并单独为每个视图设置动画?

有什么建议么?

4

3 回答 3

1

创建您的动画并在您的列表中调用它OnItemClickListener。之后,您可以使用适配器notifyDataSetChanged刷新列表内容。

在此示例中,我创建了一个名为removeListItemwith 的方法,用于接收您要删除的行以及该行在列表内容数组中的位置。

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 回答
1

我有一个非常相似的问题,并且能够找到一个简单的View子类的解决方案,它允许您使用布局动画控制器仅对您指定的视图进行动画处理。请看这个链接:

LayoutAnimationController 可以只为指定的 View 设置动画吗

于 2012-10-05T09:38:47.250 回答
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"/>   

来源:谷歌API

于 2013-03-18T19:54:01.983 回答