2015-03-11 5 views
3

У меня есть ReyclerView, работающий с LinearLayoutManager и Adapter<ViewHolder>. У меня есть список элементов, которые я хотел бы отображать в recyclerview с анимацией вставки (слайд). Как мне это сделать?RecyclerView: как создать эффект анимации вставки?

Я хотел бы отображать анимации с линейно возрастающей задержкой, основанной на индексе элемента.

В настоящее время, если я использую 2 кнопки «добавить» и «удалить», а затем сделать соответствующие операции на recyclerview (notifyItemInserted() и notifyItemRemoved(), анимации приходят в красиво.

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

Если я использую Asynctasks с линейной задержкой, а затем добавляю/удаляю элемент в OnPostExecute(), я до сих пор не вижу анимации. Кроме того, я вижу возможность запуска в тупиковые блоки, если несколько потоков вставки ждут всех удаленных потоков (без места для удаления потоков).

Что я делаю неправильно?

Я рассмотрел большинство вопросов, связанных с этим на SO, и провел дни, собираясь вокруг анимационной части recyclerview, все равно не повезло.

ответ

7

Ниже приведен пример добавления анимации в мой Adapter. Это будет анимировать эффект push, при этом строка будет справа.

Сначала определите анимацию в формате XML (res/anim/push_left_in.xml)

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="100%p" android:toXDelta="0" 
     android:duration="300"/> 
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" 
     android:duration="300" /> 
</set> 

Затем установите его в адаптер, как так

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row; 
    if (convertView == null) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     row = inflater.inflate(R.layout.music_list_item, null); 
    } else { 
     row = convertView; 
    } 

    ... 

    //Load the animation from the xml file and set it to the row 
    Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.push_left_in); 
    animation.setDuration(500); 
    row.startAnimation(animation); 

    return row; 
} 

Эта анимация будет отображаться каждый раз при добавлении новой строки, она должна работайте в вашем случае.

Редактировать

Это, как вы могли бы добавить анимацию с помощью RecyclerView

@Override 
public void onBindViewHolder(ViewHolder holder, int position) 
{ 
    holder.text.setText(items.get(position)); 

    // Here you apply the animation when the view is bound 
    setAnimation(holder.container, position); 
} 

/** 
* Here is the key method to apply the animation 
*/ 
private void setAnimation(View viewToAnimate, int position) 
{ 
    // If the bound view wasn't previously displayed on screen, it's animated 
    if (position > lastPosition) 
    { 
     Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.push_left_in); 
     viewToAnimate.startAnimation(animation); 
     lastPosition = position; 
    } 
} 
+1

Посмотрите на [этот ответ] (http://stackoverflow.com/questions/26724964/how-to-animate-recyclerview-items-when-they-appear). Автор объясняет, где добавить анимацию, когда вы используете «RecyclerView». @milindbableshwar – Marcus

+0

Я редактирую соответствующий код для ответа, пожалуйста, посмотрите. @milindbableshwar – Marcus

+0

Отлично! Это работает. Следующий вопрос, как удалить анимированные элементы? Я имею в виду, если бы я программно удалял список элементов, где я должен начать анимацию элемента удаления? – milindbableshwar

3

Это работает для меня:

animation.setStartOffset(position*100); 
+3

Не могли бы вы уточнить? – Kmeixner

3

Добавить эту строку в RecyclerView XML:

android:animateLayoutChanges="true"

+0

Я ищу этот ответ на неделю, спасибо! – Hmm

+0

@ Хмм Я рад, что это помогло! – penduDev

Смежные вопросы