在我的适配器中使用动画时,我有问题.
- @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);
- }
这当然是不行的,如果动画需要这么长的时间,视图已被回收利用在此期间.