listview的适配器不是很完美

时间:2014-04-02 12:32:13

标签: android view adapter listitem recycle

我想在listitem按钮上显示动画。动画效果很好。我没有点击的其他一些按钮也显示了动画。我发现问题在于适配器中的回收视图。任何人都可以帮助我处理这种情况..这是我写的代码:适配器内部的getview方法:

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);
     }
  });

1 个答案:

答案 0 :(得分: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);
}

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