Анимации внутри ListView - PullRequest
       10

Анимации внутри ListView

0 голосов
/ 07 декабря 2011

Я пытаюсь время от времени анимировать представление внутри элемента ListView.Это пользовательское представление, оно расширяет RelativeLayout, и его цель - периодически получать некоторую информацию из нескольких источников (включая Интернет) и отображать ее.Всякий раз, когда доступна новая информация, новое дочернее представление создается программно.Старый вид анимирован из пользовательского вида (RelativeLayout), а новый вид анимирован точно так, как работает ViewFlipper.Это представление прекрасно работает при размещении в обычных макетах, но у меня возникают проблемы при размещении его в элементе ListView.Проблема в том, что он перестает перерисовываться после одного или двух прокруток в списке - сразу после того, как он выходит из экрана и возвращается снова.Анимации больше не видны, а пользовательский вид отображается только при взаимодействии со списком.Я пытался сделать просмотр недействительным, сделать недействительным список и другие параметры, однако это не работает ...

Любая помощь очень ценится.Спасибо.

Вот некоторый код, похожий на точный механизм, который я пробовал для своего пользовательского представления (здесь я использовал ViewFlipper, чтобы проверить, если что-то не так с моим представлением. По-видимому, он ведет себя так же, после чего флиппер не перерисовываетсявзаимодействуя со списком)

package com.test.viewflipper;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.ViewFlipper;

public class ViewFlipperTestActivity extends ListActivity {
  /** Called when the activity is first created. */

  private ViewFlipper viewFlipper;
  private Animation TRANSLATE_LEFT_TO_RIGHT_VIEW_IN = new TranslateAnimation(Animation.RELATIVE_TO_SELF, -1.0f,
      Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f);
  private Animation TRANSLATE_LEFT_TO_RIGHT_VIEW_OUT = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,
      Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f);

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    viewFlipper = new ViewFlipper(this);
    LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    viewFlipper.setLayoutParams(new AbsListView.LayoutParams(params));
    viewFlipper.setInAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_IN);
    viewFlipper.setOutAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_OUT);
    for (int i = 0; i < 10; i++) {
      Button button = new Button(getApplicationContext());
      button.setText("Button " + i);
      viewFlipper.addView(button);
    }
    viewFlipper.setFlipInterval(1000);
    viewFlipper.setAutoStart(true);
    viewFlipper.startFlipping();

    LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    setListAdapter(new AdListAdapter(layoutInflater));
  }

  private class AdListAdapter extends BaseAdapter {

    private LayoutInflater layoutInflater;

    public AdListAdapter(LayoutInflater layoutInflater) {
      this.layoutInflater = layoutInflater;
    }

    @Override
    public int getCount() {
      return 10;
    }

    @Override
    public Object getItem(int position) {
      return null;
    }

    @Override
    public long getItemId(int position) {
      return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      /* return the ad container for the first position */
      if (position == 0) {
        return viewFlipper;
      }
      else {
        View view = layoutInflater.inflate(android.R.layout.simple_list_item_1, null);
        TextView textView = (TextView) view.findViewById(android.R.id.text1);
        textView.setText("Item " + position);
        return view;
      }
    }
  }
}

1 Ответ

0 голосов
/ 07 декабря 2011

Если это пользовательский вид, пытались ли вы запустить анимацию вручную?Создание анимации программно или в формате xml с последующим использованием view.startAnimation(animation).

Также не могли бы вы показать какой-нибудь код?


Обновление:

Хорошо, во-первых, анимация начинается каждую секунду.Но я бы порекомендовал удалить viewFlipper из действия и переписать пользовательский адаптер в это:

private class AdListAdapter extends ArrayAdapter<String> {

private ViewFlipper viewFlipper;
private LayoutInflater layoutInflater;

public AdListAdapter(Context context) {
  super(context, android.R.layout.simple_list_item_1, android.R.id.text1);
  // NOTE: This should be done with an xml
  viewFlipper = new ViewFlipper(context);
  LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
  viewFlipper.setLayoutParams(new AbsListView.LayoutParams(params));
  viewFlipper.setInAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_IN);
  viewFlipper.setOutAnimation(TRANSLATE_LEFT_TO_RIGHT_VIEW_OUT);
  viewFlipper.setFlipInterval(1000);
  for (int i = 0; i < 10; i++) {
    Button button = new Button(getApplicationContext());
    button.setText("Button " + i);
    viewFlipper.addView(button);
    // add an item to the adapter
    add("Item " + i);
  }
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  if (position == 0) {
    // check if it's flipping
    if(!viewFlipper.isFlipping()) {
      viewFlipper.startFlipping();
    }
    return viewFlipper;
  } else if(convertView == viewFlipper) {
    // makes sure that the flipping is stopped when the viewFlipper is reused
    if(viewFlipper.isFlipping()) {
      viewFlipper.stopFlipping();
    }
    convertView = null;
  }
  return super.getView(position, convertView, parent);
 }
}

, а затем создать его, используя:

setListAdapter(new AdListAdapter(this));

Я не проверял его, но это может работать таким образом, кроме упрощения кода и повторного использования представлений (небольшие важные особенности Android)

...