2013-10-24 54 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