2014-04-02 132 views
0

我想在listitem按钮上显示一个动画。动画效果很好。我没有点击的其他按钮也显示动画。我发现问题将出现在适配器的回收视图中。谁能帮我处理这种情况。这里是我写的代码:适配器getview方法中:listview的适配器不工作perefct

viewHolder.getrate.setOnClickListener(
    new CompoundButton.OnClickListener() { 
     public void onClick(View paramView) { 
     ListData rateobj = (ListData) viewHolder.getrate.getTag(); 
     paramView.setBackgroundResource(R.drawable.spin_animation); 

     // Get the background, which has been compiled to an AnimationDrawable object. 
     frameAnimation = (AnimationDrawable) paramView.getBackground(); 

     // Start the animation (looped playback by default). 
     frameAnimation.start(); 

     NetworkRun nt = new NetworkRun(rateobj); 
     String number=rateobj.getDescription(); 
     String num=number.replaceAll("\\s+",""); 
     nt.execute(num); 

     viewHolder.load.setEnabled(true); 
     viewHolder.load.setVisibility(View.VISIBLE); 
    } 
    }); 

回答

0

您应该以某种方式在getView(...)删除动画,所以每一个观点被重复使用时它会重置动画。 我建议以下思路:

public View getView(int position, View convertView, ViewGroup parent) { 
    // ... inflate convertView, create viewHolder, etc. 
    convertView.setBackgroundResource(0); // <-- this will remove animation 
    viewHolder.getrate.setOnClickListener(/* your code here */); 
} 

唯一的问题是,动画甚至会消失,它应该存在的项目。 对于这种情况,您可以通过存储一组动画项目的位置来修改解决方案。

Set<Integer> animatedPositions = new HashSet<Integer>(); 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // ... inflate convertView, create viewHolder, etc. 
    if(animatedPositions.contains(position)) { 
     showAnimation(convertView); 
    } else { 
     hideAnimation(convertView); 
    }  
    viewHolder.getrate.setOnClickListener(
     new OnClickListener() { 
      public void onClick(View paramView) { 
       animatedPositions.add(position); 
       showAnimation(paramView); 
       // your code 
      } 
     } 
    ); 
} 

private void showAnimation(View view) { 
    view.setBackgroundResource(R.drawable.spin_animation); 
    AnimationDrawable frameAnimation = (AnimationDrawable) paramView.getBackground(); 
    frameAnimation.start(); 
} 

private void hideAnimation(View view) { 
    convertView.setBackgroundResource(0); 
} 

当然,当您删除动画(网络执行后)时,您应该从集合中删除位置。