Адаптер listview не работает, perefct

Я хочу показать анимацию на кнопке списка элементов. Анимация работает отлично. некоторые другие кнопки, на которые я не нажимал, также показывают анимацию. Я обнаружил, что проблема будет заключаться в переработке представлений в адаптерах. Может кто-нибудь помочь мне справиться с этой ситуацией.. Вот код, который я написал: внутри 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 ответ

Вы должны как-то удалить анимацию в 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);
}

Конечно, вы должны удалять позиции из набора при удалении анимации (после выполнения по сети).

Другие вопросы по тегам