Подтвердить что ты не робот

ListView анимировать отдельный элемент

У меня есть ListView с элементами в нем. Когда пользователь нажимает на элемент, высота должна масштабироваться до нуля, и все элементы ниже должны прокручиваться вверх. Мой код ниже не работает. С моим кодом элемент, который был нажат, масштабируется вправо, но элементы ниже не прокручиваются вверх, они остаются в том же положении. Я также пробовал его с LinearLayout, но есть та же проблема.

Есть приложение, которое делает это правильно. Он назывался Tasks.

This little image should explain the problem

Моя текущая реализация выглядит следующим образом:

@Override
public void onItemClick(AdapterView<?> arg0, View v, final int index,
        long id) {
    Animation anim = AnimationUtils.loadAnimation(getActivity(),
            R.anim.scaleup);
    v.startAnimation(anim);
}

<set android:shareInterpolator="false" >
    <scale
        android:duration="700"
        android:fillAfter="false"
        android:fillBefore="false"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotY="0%"
        android:toXScale="1.0"
        android:toYScale="0.0" />
</set>

4b9b3361

Ответ 1

Здесь класс, который я сделал (измененный из источника, который я нашел здесь), который может предоставить вам необходимую функциональность.

public class FadeUpAnimation extends Animation {

int mFromHeight;
View mView;

public FadeUpAnimation(View view) {
    this.mView = view;
    this.mFromHeight = view.getHeight();
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    int newHeight;
    newHeight = (int) (mFromHeight * (1 - interpolatedTime));
    mView.getLayoutParams().height = newHeight;
    mView.setAlpha(1 - interpolatedTime);
    mView.requestLayout();
}

@Override
public void initialize(int width, int height, int parentWidth,
        int parentHeight) {
    super.initialize(width, height, parentWidth, parentHeight);
}

@Override
public boolean willChangeBounds() {
    return true;
}
}

Тогда вот как я его использую

View tv = ...
Animation a = new FadeUpAnimation(tv);
a.setInterpolator(new AccelerateInterpolator());
a.setDuration(300);
tv.setAnimation(a);
tv.startAnimation(a);

Вы можете поиграть с ним, чтобы узнать, можете ли вы получить его в соответствии с вашими потребностями.

Ответ 2

Повторно ли вы используете элемент с кликом? Если нет, то вы можете

  • Дождитесь окончания анимации
  • Удалить элемент из места хранения данных подкладки
  • Затем вызовите метод notifyDataSetChanged() вашего listadapter

Ответ 3

Android не действует как HTML, когда вы изменяете ширину, высоту или видимость в представлении, другие представления не обновляют свои позиции. Если вам нужно это сделать, вы должны обновить все списки и свои представления внутри, индивидуально. Это сложный код.