Как применить анимацию макета Android только для детей выше определенного индекса? - PullRequest
14 голосов
/ 11 января 2011

У меня есть ListView, содержащий серию заметок.

В настоящее время я использую анимацию макета для скольжения всех заметок со стороны, когда список загружается впервые;это прекрасно работает.

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

Я попытался найти способ настроить задержки анимации или интерполяторы по дочернему индексуно не нашел ничего подходящего для этого места.Есть ли способ сделать это с помощью пользовательской анимации макета (например, расширение LayoutAnimationController), или мне нужно будет сделать этот низкий уровень и анимировать каждый вид отдельно?

Есть предложения?

Ответы [ 3 ]

1 голос
/ 05 октября 2012

У меня была очень похожая проблема, и я смог найти решение с помощью простого подкласса View, который позволяет использовать контроллер анимации макета для анимации только указанных видов. Пожалуйста, смотрите эту ссылку:

Может ли LayoutAnimationController анимировать только указанные виды

1 голос
/ 27 сентября 2012

Создайте анимацию и назовите ее в своем списке OnItemClickListener.После этого вы можете использовать адаптер notifyDataSetChanged для обновления содержимого списка.

В этом примере я создал метод с именем removeListItem, который получает строку, которую вы хотите удалить, и позицию этой строки в вас.список содержимого массива.

public class MainActivity extends ListActivity implements OnItemClickListener{

ArrayList<String> values;
ArrayAdapter<String> adapter;

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

    values = generateMockData(50);

    adapter = new ArrayAdapter<String>(
            this, android.R.layout.simple_list_item_1, values);

    setContentView(R.layout.activity_main);

    getListView().setAdapter(adapter);
    getListView().setOnItemClickListener(this);
}

private ArrayList<String> generateMockData(int number) {

    ArrayList<String> result = new ArrayList<String>();

    for(int i = 0; i < number; i++)
        result.add(""+i+" "+ (int)Math.random() * 13);

    return result;
}

private void removeListItem(View rowView, final int positon) {

    Animation anim = AnimationUtils.loadAnimation(this,
            android.R.anim.slide_out_right);
    anim.setDuration(500);
    rowView.startAnimation(anim);

    new Handler().postDelayed(new Runnable() {

        public void run() {

            values.remove(positon);//remove the current content from the array

            adapter.notifyDataSetChanged();//refresh you list

        }

    }, anim.getDuration());

}

public void onItemClick(AdapterView<?> arg0, View row, int position, long arg3) {

       if(position == YOUR_INDEX) //apply your conditions here!
          removeListItem(row,position);
}
0 голосов
/ 18 марта 2013

В вашем макете xml попробуйте добавить:

<ListView  
  android:id="@android:id/list"
  ... 
  android:animateLayoutChanges="true"/>  

Это автоматически оживит вставки и удаления из вашего списка.
Если у вас есть пользовательская анимация с именем anim_translate_left, используйте вместо этого:

<ListView  
  android:id="@android:id/list"
  ... 
  android:animateLayoutChanges="@anim/anim_translate_left"/>   

Источник: Google API's

...