2013-10-24 156 views
1

我有一个列表视图和项目列表。每个项目都有一个带有星号的小图片按钮,将其标记为最爱。点击明星ImageButton时,我希望它做一点旋转。在Android 4.3中可以正常工作,但在2.3版本上,不仅点击的星星会旋转,还会在上面的项目中显示星星。在ListView中查看动画

我已经试图不使用ViewHolder的明星,因为我认为这可能会导致它,但这并没有帮助。

顺便说一下,我在onClickListener中做了其他的工作,并且工作正常,只能用于点击的项目。

可能是我的问题?

这是在列表中的适配器我getView方法的一部分:

CheckableImageButton favBtn = (CheckableImageButton) convertView 
      .findViewById(R.id.favbtn); 

    favBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      v.startAnimation(AnimationUtils.loadAnimation(ctx, 
        R.anim.spinanim)); 

     } 
    }); 

这是我的整个getView方法:

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    checkLoadMore(position); 

    final Item item = combinedResult.getItems().get(position); 

    if (convertView == null) { 
     convertView = myInflater.inflate(R.layout.item_fewo_v7, null); 

     holder = new ViewHolder(); 

     holder.Iv = (RecyclingImageView) convertView 
       .findViewById(R.id.imageView1); 
     holder.Tv1 = (TextView) convertView.findViewById(R.id.textView1); 
     holder.Tv2 = (TextView) convertView.findViewById(R.id.textView2); 
     holder.Tv3 = (TextView) convertView.findViewById(R.id.textView3); 
     holder.Tv4 = (TextView) convertView.findViewById(R.id.textView4); 
     holder.Root = (RelativeLayout) convertView.findViewById(R.id.root); 
     holder.Starbg = (RelativeLayout) convertView 
       .findViewById(R.id.starbg); 

     convertView.setTag(holder); 
    } 

    else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    CheckableImageButton favBtn = (CheckableImageButton) convertView 
      .findViewById(R.id.favbtn); 

    favBtn.setChecked(FavItems.contains(item.getGuid())); 

    favBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      if (FavItems.contains(item.getGuid())) { 
       FavItems.removeFav(item.getGuid()); 
      } 

      else { 
       FavItems.addFav(item); 
      } 

      v.startAnimation(AnimationUtils.loadAnimation(ctx, 
        R.anim.spinanim)); 

     } 
    }); 

    holder.Tv1.setText(item.getTitle()); 
    holder.Tv2.setText(item.getLocation().getDescription()); 
    holder.Tv3.setText(item.getPrice().getPriceText() + " " 
      + item.getPrice().getPaymentIntervalShort()); 
    holder.Tv4.setText("bis " + item.getPersonsMax() + " Personen"); 

    displayImage(Tools.convertImageUrl(item.getThumbnailUrl()), holder.Iv, 
      holder.Root); 


    return convertView; 
} 

enter image description here

+0

您需要使用标记。使用setTag()和getTag()方法将标签添加到图像按钮,它可以帮助您识别哪个按钮被点击。 – Arshu

+0

发布你的getView()方法实现 –

+0

尝试使用AnimationListner,它可能有帮助 – Abx

回答

3

Gopal Rao说的相反,应该使用convertView和ViewHolder模式。另外,您可以将FavBtn移动到ViewHolder中。当视图被重用时,您确实需要清除动画,这是在else子句中完成的。以下应该工作:

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 

    checkLoadMore(position); 

    final Item item = combinedResult.getItems().get(position); 

    if (convertView == null) { 
     convertView = myInflater.inflate(R.layout.item_fewo_v7, null); 

     holder = new ViewHolder(); 
     holder.Iv = (RecyclingImageView) convertView.findViewById(R.id.imageView1); 
     holder.Tv1 = (TextView) convertView.findViewById(R.id.textView1); 
     holder.Tv2 = (TextView) convertView.findViewById(R.id.textView2); 
     holder.Tv3 = (TextView) convertView.findViewById(R.id.textView3); 
     holder.Tv4 = (TextView) convertView.findViewById(R.id.textView4); 
     holder.Root = (RelativeLayout) convertView.findViewById(R.id.root); 
     holder.Starbg = (RelativeLayout) convertView.findViewById(R.id.starbg); 
     holder.FavBtn = (CheckableImageButton) convertView.findViewById(R.id.favbtn); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
     holder.FavBtn.setAnimation(AnimationUtils.loadAnimation(ctx, R.anim.spinanim)); 
    } 

    holder.FavBtn.setChecked(FavItems.contains(item.getGuid())); 
    holder.FavBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (FavItems.contains(item.getGuid())) { 
       FavItems.removeFav(item.getGuid()); 
      } else { 
       FavItems.addFav(item); 
      } 

      holder.FavBtn.getAnimation().startNow(); 
     } 
    }); 

    holder.Tv1.setText(item.getTitle()); 
    holder.Tv2.setText(item.getLocation().getDescription()); 
    holder.Tv3.setText(item.getPrice().getPriceText() + " " + item.getPrice().getPaymentIntervalShort()); 
    holder.Tv4.setText("bis " + item.getPersonsMax() + " Personen"); 

    displayImage(Tools.convertImageUrl(item.getThumbnailUrl()), holder.Iv, holder.Root); 

    return convertView; 
} 
+0

谢谢,但是这样做的效果是根本没有显示动画。我猜动画被清除得很快。 – FWeigl

+0

我更新了答案。我没有清除动画,而是将它设置在else子句中。稍后点击时,动画开始。请尝试,如果有效。 –

+1

我发现为什么动画的清除速度如此之快:当我最喜欢的项目发生变化时,适配器将使用notifyDataSetChanged()进行刷新。我会以某种方式延迟这一点。 但除此之外,你的答案有用,非常感谢:) – FWeigl

0

试试这个...

public View getView(final int position, View convertView, ViewGroup parent) { 

     checkLoadMore(position); 

     final Item item = combinedResult.getItems().get(position); 

     convertView = myInflater.inflate(R.layout.item_fewo_v7, null); 

     RecyclingImageView Iv = (RecyclingImageView) convertView 
       .findViewById(R.id.imageView1); 

     TextView Tv1 = (TextView) convertView.findViewById(R.id.textView1); 
     TextView Tv2 = (TextView) convertView.findViewById(R.id.textView2); 
     TextView Tv3 = (TextView) convertView.findViewById(R.id.textView3); 
     TextView Tv4 = (TextView) convertView.findViewById(R.id.textView4); 
     RelativeLayout Root = (RelativeLayout) convertView.findViewById(R.id.root); 
     RelativeLayout Starbg = (RelativeLayout) convertView 
       .findViewById(R.id.starbg); 



     CheckableImageButton favBtn = (CheckableImageButton) convertView 
       .findViewById(R.id.favbtn); 

     favBtn.setChecked(FavItems.contains(item.getGuid())); 

     favBtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       if (FavItems.contains(item.getGuid())) { 
        FavItems.removeFav(item.getGuid()); 
       } 

       else { 
        FavItems.addFav(item); 
       } 

       v.startAnimation(AnimationUtils.loadAnimation(ctx, 
         R.anim.spinanim)); 

      } 
     }); 

     Tv1.setText(item.getTitle()); 
     Tv2.setText(item.getLocation().getDescription()); 
     Tv3.setText(item.getPrice().getPriceText() + " " 
       + item.getPrice().getPaymentIntervalShort()); 
     Tv4.setText("bis " + item.getPersonsMax() + " Personen"); 

     displayImage(Tools.convertImageUrl(item.getThumbnailUrl()), Iv, 
       Root); 


     return convertView; 
    } 

stop convert with convertview,因为当convertview不为null时,您将返回相同的视图实例。因此具有相同实例的视图将具有相同的动画

+0

我试过了,它没有效果。而且,这意味着我根本没有使用Viewholder,并且列表变得真实。 – FWeigl