使用动画展开列表视图(在少数项目上 - 而不是整个列表)

时间:2013-11-29 13:23:23

标签: android list listview collapse expand

事实: 我有一个包含6个项目(字符串)的列表,最后一个项目的字符串是“更多选项”。

点击“更多选项”后,列表应在第5项和“更多选项”(最后一项)之间添加3个项目。

 - item1
 - item2
 - item3
 - item4
 - item5
 - "more options"

问题: 我使用notifyDataSetChanged()通知适配器将新项添加到列表中。 但是最好的方法是动画将列表从6个项目扩展到9个项目而不重新创建整个列表?

列表的最终外观(在将item6,item7,item8与一个动画放在一起之后)。

 - item1
 - item2
 - item3
 - item4
 - item5
 - item6 (new)
 - item7 (new)
 - item8 (new)
 - "more options"

将每件物品放在一起并使item6,item7,item8不可见是不好的做法/ hacky?什么是最好的方式?

我希望我的问题写得很好,每个人都能理解我的痛苦。

由于

1 个答案:

答案 0 :(得分:1)

你必须创建像这样的动画

 private void enlarge(final View v, AnimationListener al)
{
    final int initialHeight = v.getMeasuredHeight();

    Animation anim = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t)
        {
            if (interpolatedTime == 1)
            {
                v.setVisibility(View.GONE);
            }
            else
            {
                v.getLayoutParams().height = initialHeight + (int) (initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds()
        {
            return true;
        }
    };

    if (al != null)
    {
        anim.setAnimationListener(al);
    }
    anim.setDuration(ANIMATION_DURATION);
    v.startAnimation(anim);
}

然后在创建AnimationListener

之前将项目添加到listview时使用此选项
  AnimationListener al = new AnimationListener() {
        @Override
        public void onAnimationEnd(Animation arg0)
        {
            mAnimList.remove(index);

            ViewHolder vh = (ViewHolder) v.getTag();
            vh.needInflate = true;

            mMyAnimListAdapter.notifyDataSetChanged();
        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {
        }

        @Override
        public void onAnimationStart(Animation animation)
        {
        }
    };

并最终致电

  enlarge(v, al);