android – 使用ViewHolder模式的适配器中的动画

前端之家收集整理的这篇文章主要介绍了android – 使用ViewHolder模式的适配器中的动画前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的适配器中使用动画时,我有问题.
@Override
    public View getView(int position,View convertView,ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(resource,parent,false);
            holder = new ViewHolder();

            holder.newRoomView = (TextView) convertView.findViewById(R.id.newRoom);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Room item = items.get(position);

        // animate new rooms
        if (item.isNewRoom()) {
            AlphaAnimation alphaAnim = new AlphaAnimation(1.0f,0.0f);
            alphaAnim.setDuration(1500);
            alphaAnim.setAnimationListener(new AnimationListener() {
                public void onAnimationEnd(Animation animation) {
                    holder.newRoomView.setVisibility(View.INVISIBLE);
                }

                @Override
                public void onAnimationStart(Animation animation) {}

                @Override
                public void onAnimationRepeat(Animation animation) {}
            });
            holder.newRoomView.startAnimation(alphaAnim);
        }

        // ...

        return convertView;
    }

在适配器外面添加一个新房间并调用notifyDataSetChanged新房间是正确的动画,但是当onAnimationEnd被调用时,另一个(不是新的房间)被隐藏.

有什么办法可以隐藏正确的房间吗?

解决方法

由于您尚未在getView()方法中声明持有人变量,我只能假设您已将其声明为类中的实例变量.这是你的问题.在动画完成时,变量持有人持有对完全不同的项目的引用.

您需要使用在getView()方法中声明为final的局部变量.我不知道在getView()方法之外是否需要这个持有者变量,但如果你这样做,你可以这样做:

// animate new rooms
    if (item.isNewRoom()) {
        final ViewHolder holderCopy = holder; // make a copy
        AlphaAnimation alphaAnim = new AlphaAnimation(1.0f,0.0f);
        alphaAnim.setDuration(1500);
        alphaAnim.setAnimationListener(new AnimationListener() {
            public void onAnimationEnd(Animation animation) {
                holderCopy.newRoomView.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onAnimationStart(Animation animation) {}

            @Override
            public void onAnimationRepeat(Animation animation) {}
        });
        holder.newRoomView.startAnimation(alphaAnim);
    }

这当然是不行的,如果动画需要这么长的时间,视图已被回收利用在此期间.

猜你在找的Android相关文章