在不将动画应用于标题的情况下为ListView设置动画

时间:2014-02-13 00:17:38

标签: android animation android-listview

我目前有一个附有页眉和页脚的列表视图。我现在正在尝试为列表中的项目设置动画,但是当我将LayoutAnimationController应用于列表视图时,标题也会动画化。有没有办法将动画应用到整个列表而不影响标题?

我目前已经在Can LayoutAnimationController animate only specified Views尝试了解决方案,方法是创建一个检查动画的LinearLayout子类,但标题仍然是其余项目的动画。

public class AnimationAverseLinearLayout extends LinearLayout {
    private boolean mIsAnimatable = true;

    public AnimationAverseLinearLayout(Context context) {
        super(context);
    }

    public AnimationAverseLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setAnimatable(boolean isAnimatable) {
        if(!isAnimatable)
            clearAnimation();
        mIsAnimatable = isAnimatable;
    }     

    @Override
    public void startAnimation(Animation animation) {
        if(mIsAnimatable) {
            super.startAnimation(animation);
        }
    }
}

...

//in onCreateView
ListView listView = (ListView) v.findViewById(android.R.id.list);
listView.setLayoutAnimation(Animations.animateListView(listView.getContext())); 
header = (com.yardi.hud.inspections.util.AnimationAverseLinearLayout) inflater.inflate(R.layout.fragment_case_search_header, null, false);
header.setAnimatable(false);
listView.addHeaderView(header);
...
SearchAdapter adapter = new SearchAdapter(results);
setListAdapter(adapter);

3 个答案:

答案 0 :(得分:1)

我遇到了上面描述的相同问题 - 动画正在应用于ListView标题以及列表行。我在this answer的帮助下解决了这个问题。我将标题的最外层视图(在我的例子中是一个FrameLayout)子类化,并覆盖了动画方法,不采取任何操作。例如:

list_header.xml:

<my.project.NonAnimatingFrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  ...
  >
 <!-- other views in your header -->
 ...
</my.project.NonAnimatingFrameLayout>

package my.project

public class NonAnimatingFrameLayout extends FrameLayout {
  ...
  @Override
  public void setAnimation(Animation animation) {
    // do nothing 
  }

您需要覆盖我的动画方法因最外层视图的类型而异。

答案 1 :(得分:0)

不是最好的解决方案,但它可以替代例如:

  • 创建一个容器视图(LinearLayout垂直方向)
  • 添加标题视图
  • 添加您的ListView
  • 添加页脚视图

我的意思是,页眉和页脚将独立于您的列表组件,并且可以快速修复。不是吗?您仍然可以控制页眉/页脚可见性,例如,只需将可见性设置为View.GONE

也是1 ,您还可以实施其他方法吗?我的意思是,canAnimate或类似的东西? 同样2 ,您的getView方法是如何实施的。

简单提供一下我所解释的内容:

<!-- Scrollable container -->
<ScrollView
    android:id="@+id/scrollContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Container view -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list"
        android:orientation="vertical">

        <!-- Header view -->
        <TextView
            android:id="@+id/header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/header_text" />

        <!-- LinearLayout acting as ListView -->
        <LinearLayout
            android:orientation="vertical"
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <!-- Insert rows into the fake list -->
            <TextView
                android:id="@+id/row_item"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/row_item" />

        </LinearLayout>

        <!-- Footer view -->
        <TextView
            android:id="@+id/footer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/footer_text" />
    </LinearLayout>
</ScrollView>

我相信问题现在已经解决了:)

答案 2 :(得分:0)

如果您只想查看此xml文件,我会尝试这样做

我声明页眉和页脚分开&amp;如果你想要你可以动画列表视图,Listview分开。页眉和页脚不会生成动画。

如果你给页眉和页脚Animate那么它也会动画......

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

  <!-- Header aligned to top -->
  <RelativeLayout
    android:id="@+id/header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="#FC9"
    android:gravity="center" >

    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="5dp"
      android:text="Fixed Header"
      android:textColor="#000"
      android:textSize="20sp" />
  </RelativeLayout>

  <!-- Footer aligned to bottom -->
  <RelativeLayout
    android:id="@+id/footer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="#FC0"
    android:gravity="center" >

    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="5dp"
      android:text="Fixed Footer"
      android:textColor="#000"
      android:textSize="20sp" />
  </RelativeLayout>

  <!-- LIstview Item below header and above footer -->

  <ListView
      android:id="@+id/listView1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_above="@+id/footer"
      android:layout_alignParentLeft="true"
      android:layout_below="@+id/header" >

  </ListView>

</RelativeLayout>