Giter VIP home page Giter VIP logo

recyclerview-animators's Introduction

RecyclerView Animators

Android Arsenal License Maven Central

RecyclerView Animators is an Android library that allows developers to easily create RecyclerView with animations.

Please feel free to use this.

Features

Demo

ItemAnimator

Adapters

How do I use it?

Setup

Gradle

On your module's build.gradle file add this implementation statement to the dependencies section:

dependencies {
  // Kotlin
  implementation 'jp.wasabeef:recyclerview-animators:4.0.2'
}

Also make sure that the repositories section includes not only "mavenCentral()" but also a maven section with the "google()" endpoint.

repositories {
  google()
  mavenCentral()
  jcenter()
}

ItemAnimator

Step 1

Set RecyclerView ItemAnimator.

val recyclerView = findViewById<RecyclerView>(R.id.list)
recyclerView.itemAnimator = SlideInLeftAnimator()
val recyclerView = findViewById<RecyclerView>(R.id.list)
recyclerView.itemAnimator = SlideInUpAnimator(OvershootInterpolator(1f))

Step 2

Please use the following
notifyItemChanged(int)
notifyItemInserted(int)
notifyItemRemoved(int)
notifyItemRangeChanged(int, int)
notifyItemRangeInserted(int, int)
notifyItemRangeRemoved(int, int)

If you want your animations to work, do not rely on calling notifyDataSetChanged(); as it is the RecyclerView's default behavior, animations are not triggered to start inside this method.

fun remove(position: Int) {
  dataSet.removeAt(position)
  notifyItemRemoved(position)
}

fun add(text: String, position: Int) {
  dataSet.add(position, text)
  notifyItemInserted(position)
}

Advanced Step 3

You can change the durations.

recyclerView.itemAnimator?.apply {
  addDuration = 1000
  removeDuration = 100
  moveDuration = 1000
  changeDuration = 100
}

Advanced Step 4

Change the interpolator.

recyclerView.itemAnimator = SlideInLeftAnimator().apply {
  setInterpolator(OvershootInterpolator())
}

Advanced Step 5

By implementing AnimateViewHolder, you can override preset animation. So, custom animation can be set depending on view holder.

class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), AnimateViewHolder {

  override fun preAnimateRemoveImpl(holder: RecyclerView.ViewHolder) {
    // do something
  }

  override fun animateRemoveImpl(holder: RecyclerView.ViewHolder, listener: ViewPropertyAnimatorListener) {
    itemView.animate().apply {
      translationY(-itemView.height * 0.3f)
      alpha(0f)
      duration = 300
      setListener(listener)
    }.start()
  }

  override fun preAnimateAddImpl(holder: RecyclerView.ViewHolder) {
    itemView.setTranslationY(-itemView.height * 0.3f)
    itemView.setAlpha(0f)
  }

  override fun animateAddImpl(holder: RecyclerView.ViewHolder, listener: ViewPropertyAnimatorListener) {
    itemView.animate().apply {
      translationY(0f)
      alpha(1f)
      duration = 300
      setListener(listener)
    }.start()
  }
}

Animators

Cool

LandingAnimator

Scale

ScaleInAnimator, ScaleInTopAnimator, ScaleInBottomAnimator
ScaleInLeftAnimator, ScaleInRightAnimator

Fade

FadeInAnimator, FadeInDownAnimator, FadeInUpAnimator
FadeInLeftAnimator, FadeInRightAnimator

Flip

FlipInTopXAnimator, FlipInBottomXAnimator
FlipInLeftYAnimator, FlipInRightYAnimator

Slide

SlideInLeftAnimator, SlideInRightAnimator, OvershootInLeftAnimator, OvershootInRightAnimator
SlideInUpAnimator, SlideInDownAnimator

RecyclerView.Adapter

Step 1

Set RecyclerView ItemAnimator.

val recyclerView = findViewById<RecyclerView>(R.id.list)
recyclerView.adapter = AlphaInAnimationAdapter(MyAdapter())

Java

RecyclerView recyclerView = findViewById(R.id.list);
recyclerView.setAdapter(new AlphaInAnimationAdapter(MyAdapter());

Advanced Step 2

recyclerView.adapter = AlphaInAnimationAdapter(MyAdapter()).apply {
  // Change the durations.
  setDuration(1000)
  // Change the interpolator.
  setInterpolator(vershootInterpolator())
  // Disable the first scroll mode.
  setFirstOnly(false)
}

Java

AlphaInAnimationAdapter alphaInAnimationAdapter = new AlphaInAnimationAdapter(new MyAdapter());
alphaInAnimationAdapter.setDuration(1000);
alphaInAnimationAdapter.setInterpolator(new OvershootInterpolator());
alphaInAnimationAdapter.setFirstOnly(false);

Advanced Step 3

Multiple Animations

val alphaAdapter = AlphaInAnimationAdapter(MyAdapter())
recyclerView.adapter = ScaleInAnimationAdapter(alphaAdapter)

Java

recyclerView.setAdapter(new ScaleInAnimationAdapter(alphaInAnimationAdapter));

Adapters

Alpha

AlphaInAnimationAdapter

Scale

ScaleInAnimationAdapter

Slide

SlideInBottomAnimationAdapter
SlideInRightAnimationAdapter, SlideInLeftAnimationAdapter

Applications using RecyclerView Animators

Please ping me or send a pull request if you would like to be added here.

Icon Application
Ameba Ownd
QuitNow!
AbemaTV
CL

Developed By

Daichi Furiya (Wasabeef) - [email protected]

Follow me on Twitter

Contributions

Any contributions are welcome!

Contributers

Thanks

  • Inspired by AndroidViewAnimations in daimajia.

License

Copyright 2020 Daichi Furiya / Wasabeef

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

recyclerview-animators's People

Contributors

alekseyld avatar andy671 avatar aphexcx avatar ardacebi avatar areeb111 avatar bitdeli-chef avatar christophereluc avatar evin1- avatar gabrielemariotti avatar gaumala avatar hbb20 avatar hiroq avatar jlleitschuh avatar jonathan-caryl avatar kofuk avatar lcdsmao avatar luugiathuy avatar mrhether avatar piasy avatar rocboronat avatar sckm avatar shinwan2 avatar vfguille96 avatar wasabeef avatar ypresto avatar yqritc avatar ysy950803 avatar ytrino avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

recyclerview-animators's Issues

Different RecyclerView.Adapter's animation (appearance animation) for scrolling direction ?

Hi,

I like this library, very simple to use! However, I would like to know if there is a way to customize (assign) two different animations depending on how I scroll up or down the RecyclerView.

E.g. Imagine with this snippet:
AnimationAdapter animationAdapter = new SlideInBottomAnimationAdapter(adapter);
animationAdapter.setFirstOnly(true);
recyclerView.setAdapter(animationAdapter);

Now, you could imagine that scrolling up and down will animate the items to 'slide from bottom,' which is nice and natural. However, when the user scrolls up, the animation is still sliding from bottom, which doesn't look as nice. It would be nice if the animation could then be 'slide from top' instead.

How do I approach this ? Does anyone have suggestions?

Thank you.

No animation unless OvershootInterpolator is set

Hi. I am using only notifyItemRemoved() and notifyItemInserted(), so to avoid notifyDataSetChanged(). When I set the item animator on the RecyclerView, the animation when adding a new element (SlideInUpAnimator) is not shown, unless I set OvershootInterpolator too.

So, when using this code:

mRecyclerView.setItemAnimator(new SlideInUpAnimator());
mRecyclerView.getItemAnimator().setAddDuration(1000);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

There is no animation. But with the next code, it shows the element sliding in from below, but with the bouncing effect (which I do not want to have):

mRecyclerView.setItemAnimator(new SlideInUpAnimator(new OvershootInterpolator()));
mRecyclerView.getItemAnimator().setAddDuration(1000);
mRecyclerView.setLayoutManager(new LinearLayoutManager(JobsUserActivity.this));

I am using these in gradle:

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'jp.wasabeef:recyclerview-animators:2.1.0'

Not showing any animation

Hi , I follow your instruction But no animation appear. no exception no error

here is my recyclerView :

recyclerView = (RecyclerView) findViewById(R.id.headersList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDrawable(R.drawable.empty_divider)));
recyclerView.setItemAnimator(new SlideInLeftAnimator());
recyclerView.getItemAnimator().setChangeDuration(1000);
recyclerView.getItemAnimator().setMoveDuration(1000);
adapter = new HeadersAdapter();
recyclerView.setAdapter(adapter);

and here is my adapter :

public class HeadersAdapter extends RecyclerView.Adapter<HeadersAdapter.ViewHolder> {

    private List<LawBookHeader> items;

    public HeadersAdapter() {
        items = new BundledDataBaseManager().getLawHeaderChilds(parentHeader.getId());
    }

    @Override
    public HeadersAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int itemType) {

        View rootView = getLayoutInflater().inflate(layoutRes, viewGroup, false);
        rootView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LawBookHeader item = getItem(recyclerView.getChildAdapterPosition(v));
                if (item.hasChild()) {
                    startActivity(createIntent(LawBookHeaderActivity.this, item));
                } else if (item.hasContent()) {
                    startActivity(LawBookItemsActivity.createIntent(LawBookHeaderActivity.this, item));
                }
            }
        });

        return new ViewHolder(rootView);
    }



    public LawBookHeader getItem(int position) {
        return items.get(position);
    }


    @Override
    public long getItemId(int position) {
        return getItem(position).getId();
    }

    @Override
    public int getItemCount() {
        return items.size();
    }



    public class ViewHolder extends AnimateViewHolder {
        public TextView title;
        public TextView itemsIncluding;

        public ViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.header);
            itemsIncluding = (TextView) itemView.findViewById(R.id.itemsIncluding);
        }

        @Override
        public void animateRemoveImpl(ViewPropertyAnimatorListener listener) {
            ViewCompat.animate(itemView)
                    .translationY(-itemView.getHeight() * 0.3f)
                    .alpha(0)
                    .setDuration(300)
                    .setListener(listener)
                    .start();
        }

        @Override
        public void preAnimateAddImpl() {
            ViewCompat.setTranslationY(itemView, -itemView.getHeight() * 0.3f);
            ViewCompat.setAlpha(itemView, 0);
        }

        @Override
        public void animateAddImpl(ViewPropertyAnimatorListener listener) {
            ViewCompat.animate(itemView)
                    .translationY(0)
                    .alpha(1)
                    .setDuration(300)
                    .setListener(listener)
                    .start();
        }

    }
}

NPE in DefaultRemoveVpaListener.onAnimationEnd (version 1.1.0)

I am using version 1.1.0 and got this crash from a live user in production. The error seems like it might be stemming from this line:

jp.wasabeef.recyclerview.animators.BaseItemAnimator$DefaultRemoveVpaListener.onAnimationEnd (BaseItemAnimator.java:666)

Sorry if this has already been resolved in a newer version; I could not find anything in the changelog. I'll definitely update the library anyway, but would really appreciate any feedback from you guys.

More information about the crash (let me know if you need more):
Device: LG-D801
Android: 4.4.2
Orientation: Portrait
Rooted: no

cc @tlubz

Display animation when first time loads

I'm using adapters with recyclerviews.

Animations are displayed only when we scroll through the contents of the recyclerView.

But When the first time fragment loads, How to show animations on items ?

ScaleInAnimationAdapter & setStartPosition -> bad behavior

When I set a start position for the ScaleInAnimationAdapter, the animation is not correct.
The scale comes from the left for some items (not all) and not from the center as it should be.
It's a strange behavior.
Thanks in advance for your help.

Support for API level 7

Any chance to use NineOldAndroids to add support to API level 7?, since RecyclerView is in appcompat-v7 this may be useful. I know the library has been deprecated but checking the API level at runtime and only use NineOldAndroids on level 10 and below seems like a good idea to me.

notifyItemRemoved just work for the First removed

im my Adapter inside the

public void onBindViewHolder(ViewHolder holder, final int position) 

i have this:

holder.new_text_remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                realmDB = new RealmDB(activity);
                realmDB.updateOrCreateLei(mDataset.get(position));
                Snackbar.make(activity.getCurrentFocus(), mDataset.get(position)  + " Removed", Snackbar.LENGTH_SHORT).show();
                mDataset.remove(position);
                notifyItemRemoved(position);

            }
        });

obs: moving remove and notify to a function not resolve
for the first time i delete it works normally, but in the second it delete the next not the clicked one

example:

Before deleting:

  1. A
  2. B
  3. C
  4. D
  5. E

deleting letter A:

  1. B
  2. C
  3. D
  4. E

perfect, but when i click to delete letter B after deleting letter A, it delete letter C, maybe notifyData is not working?

can not resolve it

I use the package of "com.android.support:recyclerview-v7:23.1.1",when I was dependencies jp.wasabeef:recyclerview-animators:2.1.0,It declare that Failed to resolve: jp.wasabeef:recyclerview-animators:2.1.0

SlideInRightAnimator Crash

i'm using API 15 on Samsung Galaxy Tab 10.1

call AB method on UiThread

next .. error message

java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{4142f648 position=6 id=-1, oldPos=-1, pLpos:7undefined adapter position no parent}
at android.support.v7.widget.RecyclerView$4.attachViewToParent(RecyclerView.java:422)
at android.support.v7.widget.ChildHelper.attachViewToParent(ChildHelper.java:208)
at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:5239)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:5216)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:5204)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1325)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1274)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:525)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2072)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2415)
at android.view.View.layout(View.java:11477)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
at android.view.View.layout(View.java:11477)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11477)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
at android.view.View.layout(View.java:11477)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11477)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
at android.view.View.layout(View.java:11477)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11477)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1692)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2649)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
at dalvik.system.NativeStart.main(Native Method)

Memory Growing Issue

just install sample project. Run on an emulator. Open Memory Monitor. Scroll up and down with several times. Memory is growing. Sometimes GC start, but cannot release more memory. Always call GC.

Any idea on this issue?

Thanks

item re-appears after the remove using SlideInLeftAnimator

Hi,
After calling notifyItemRemoved(position) and after that notifyItemRangeChanged(position, data.size());
the item re-appears after the remove-animation over an other item at the same position it was "removed".
I use the SlideInLeftAnimator as
SlideInLeftAnimator animator = new SlideInLeftAnimator();
animator.setRemoveDuration(300);
mRecyclerView.setItemAnimator(animator);

and remove item as
data.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, data.size());

Note: I have compiled the latest 'jp.wasabeef:recyclerview-animators:2.1.0' and the latest 'com.android.support:recyclerview-v7:23.1.1'
and also test with FadeInAnimator with no success.

And if remove "notifyItemRangeChanged" then same bug as #56

Crashing when i use recyclerview in fragments

java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true
09-27 11:07:30.772 25402-25402/mobile.bikerenterzowner E/AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:4705)
09-27 11:07:30.772 25402-25402/mobile.bikerenterzowner E/AndroidRuntime: at android.support.v7.widget.RecyclerView.removeAnimatingView(RecyclerView.java:1050)
09-27 11:07:30.772 25402-25402/mobile.bikerenterzowner E/AndroidRuntime: at android.support.v7.widget.RecyclerView.access$5300(RecyclerView.java:141)
09-27 11:07:30.772 25402-25402/mobile.bikerenterzowner E/AndroidRuntime: at android.support.v7.widget.RecyclerView$ItemAnimatorRestoreListener.onAddFinished(RecyclerView.java:9622)
09-27 11:07:30.772 25402-25402/mobile.bikerenterzowner E/AndroidRuntime: at android.support.v7.widget.RecyclerView$ItemAnimator.dispatchAddFinished(RecyclerView.java:9967)
09-27 11:07:30.772 25402-25402/mobile.bikerenterzowner E/AndroidRuntime: at jp.wasabeef.recyclerview.animators.BaseItemAnimator$DefaultAddVpaListener.onAnimationEnd(BaseItemAnimator.java:645)

Notify changes on an item

Hi, nice library!
The animation on insert, delete and show item work very well but when I call "notifyItemChanged" or "notifyDatasetChanged" on the adapter, nothing happens.

java.lang.IndexOutOfBoundsException when removing item animator

Thank you for the library.

Recently we got a crash.

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.remove(ArrayList.java:399)
at jp.wasabeef.recyclerview.animators.BaseItemAnimator.endAnimations(BaseItemAnimator.java:598)
at android.support.v7.widget.RecyclerView.onDetachedFromWindow(RecyclerView.java:2067)
at android.view.View.dispatchDetachedFromWindow(View.java:11972)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2532)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2530)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2530)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3616)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3591)
at android.view.ViewGroup.removeView(ViewGroup.java:3523)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1167)
at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1345)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:695)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

With this code:

public class FirstTimeCardsSlideDownAnimator extends SlideInDownAnimator {

    protected static final int SLIDE_DOWN_ANIMATION_DURATION = 1500;

    private RecyclerView recyclerView;

    public FirstTimeCardsSlideDownAnimator() {
        super(new OvershootInterpolator(1f));
        setAddDuration(SLIDE_DOWN_ANIMATION_DURATION);
    }

    @Override
    public void onAnimationFinished(final RecyclerView.ViewHolder viewHolder) {
        super.onAnimationFinished(viewHolder);
        recyclerView.setItemAnimator(null);

        recyclerView.getAdapter().notifyItemChanged(2);
    }
}

It happens when we go to another activity while animation is still going.

FooterView Auto Upload

Auto upload if recyclerView have FooterView, data is have update but UI have no response.
if delete this animator, everything is OK! What can I do , I want to have this two function?

Request: merging adapters proposal

Hi, what do you think to merge my adapter in this library?
Fact is: items need to be mainly managed and not only animated, so giving opportunity to have both it is not that bad :-)

My adapter is quite stable, I am working on other improvements and functionalities now in my Dev Branch, if you like the idea please let me know.

Link to my project: https://github.com/davideas/FlexibleAdapter

Adding list item at 0th position

Hi, I tried adding an item to 0th position in the recyclerview. The item adds but the animation nor the added item shows up. I have to manually scroll up to view the added item.

Item doesn't update.

Item doesn't shown when load data from internet connection.

mAdapter = new RecyclerAdapter(listItem);
AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(mAdapter);
ScaleInAnimationAdapter scaleAdapter = new ScaleInAnimationAdapter(alphaAdapter);
mRecyclerView.setAdapter(scaleAdapter);
LoadDataAsycnTask();
.
..
...
listItem.addAll(objects);
mAdapter.notifyDataSetChanged();

BREAKING CHANGES in revision 23.1.0 of Android Support Library

Revision 23.1.0 of the Android Support Library includes the following updates:

Added an improved animation API to the ItemAnimator class for better customizations:

  • Change animations no longer enforce two copies of the ViewHolder object, which enables item content animations. Also, the ItemAnimator object decides whether it wants to reuse the same ViewHolder object or create a new one.
  • The new information record API gives the ItemAnimator class the flexibility to collect data at the correct point in the layout lifecycle. This information is later passed into the animate callbacks.
  • Provided an easy transition plan for this backward-incompatible API change:

If youโ€™ve previously extended the ItemAnimator class, you can change your base class to SimpleItemAnimator and your code should work as before. The SimpleItemAnimator class provides the old API by wrapping the new API.

Some methods were removed from the ItemAnimator class. The following code will no longer compile:

recyclerView.getItemAnimator().setSupportsChangeAnimations(false)

You can replace it with:

ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
   ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}

In my project I am using Proguard, and with the new revision of the support library there are these warnings:

Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator: can't find referenced method 'void dispatchMoveFinished(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator: can't find referenced method 'void dispatchChangeFinished(android.support.v7.widget.RecyclerView$ViewHolder,boolean)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator: can't find referenced method 'void dispatchRemoveFinished(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator: can't find referenced method 'void dispatchAddFinished(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$4: can't find referenced method 'void dispatchMoveStarting(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$4: can't find referenced method 'void dispatchMoveFinished(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$5: can't find referenced method 'void dispatchChangeStarting(android.support.v7.widget.RecyclerView$ViewHolder,boolean)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$5: can't find referenced method 'void dispatchChangeFinished(android.support.v7.widget.RecyclerView$ViewHolder,boolean)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$6: can't find referenced method 'void dispatchChangeStarting(android.support.v7.widget.RecyclerView$ViewHolder,boolean)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$6: can't find referenced method 'void dispatchChangeFinished(android.support.v7.widget.RecyclerView$ViewHolder,boolean)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$DefaultAddVpaListener: can't find referenced method 'void dispatchAddStarting(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$DefaultAddVpaListener: can't find referenced method 'void dispatchAddFinished(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$DefaultRemoveVpaListener: can't find referenced method 'void dispatchRemoveStarting(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator
Warning:jp.wasabeef.recyclerview.animators.BaseItemAnimator$DefaultRemoveVpaListener: can't find referenced method 'void dispatchRemoveFinished(android.support.v7.widget.RecyclerView$ViewHolder)' in program class jp.wasabeef.recyclerview.animators.BaseItemAnimator

Indeed, if I ignore these warnings, it causes a crash in my app. Please fix, thank you!

Cannot resolve sympol 'AlphaInAnimationAdapter'

dependencies:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:cardview-v7:23.2.1'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'jp.wasabeef:recyclerview-animators:2.2.1'
}

the code:
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
RecyclerViewAdapter mAdapter = new RecyclerViewAdapter();
mRecyclerView.setAdapter(new AlphaInAnimationAdapter(mAdapter));

thanks

LandingAnimator Crash

I've been getting this crash in my logs ever since adding a LandingAnimator to my app. I'm not sure if this is a problem with RecyclerView or not, but I figured I'd post the stacktrace here, and see what you think about it.

java.lang.NullPointerException
       at android.support.v7.widget.OrientationHelper$2.getDecoratedStart(OrientationHelper.java:316)
       at android.support.v7.widget.LinearLayoutManager.findOneVisibleChild(LinearLayoutManager.java:1633)
       at android.support.v7.widget.LinearLayoutManager.findFirstVisibleChildClosestToStart(LinearLayoutManager.java:1453)
       at android.support.v7.widget.LinearLayoutManager.computeScrollOffset(LinearLayoutManager.java:997)
       at android.support.v7.widget.LinearLayoutManager.computeVerticalScrollOffset(LinearLayoutManager.java:969)
       at android.support.v7.widget.RecyclerView.computeVerticalScrollOffset(RecyclerView.java:1175)
       at android.view.View.canScrollVertically(View.java:11991)
       at android.support.v4.view.ViewCompatICS.canScrollVertically(ViewCompatICS.java:35)
       at android.support.v4.view.ViewCompat$ICSViewCompatImpl.canScrollVertically(ViewCompat.java:940)
       at android.support.v4.view.ViewCompat.canScrollVertically(ViewCompat.java:1237)
       at android.support.v7.widget.RecyclerView$LayoutManager.onInitializeAccessibilityEvent(RecyclerView.java:6594)
       at android.support.v7.widget.RecyclerView$LayoutManager.onInitializeAccessibilityEvent(RecyclerView.java:6573)
       at android.support.v7.widget.LinearLayoutManager.onInitializeAccessibilityEvent(LinearLayoutManager.java:204)
       at android.support.v7.widget.RecyclerViewAccessibilityDelegate.onInitializeAccessibilityEvent(RecyclerViewAccessibilityDelegate.java:66)
       at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.onInitializeAccessibilityEvent(AccessibilityDelegateCompat.java:228)
       at android.support.v4.view.AccessibilityDelegateCompatJellyBean$1.onInitializeAccessibilityEvent(AccessibilityDelegateCompatJellyBean.java:56)
       at android.view.View.onInitializeAccessibilityEvent(View.java:5101)
       at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:4974)
       at android.view.View$AccessibilityDelegate.sendAccessibilityEventUnchecked(View.java:19428)
       at android.support.v4.view.AccessibilityDelegateCompatIcs.sendAccessibilityEventUnchecked(AccessibilityDelegateCompatIcs.java:117)
       at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateIcsImpl.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:210)
       at android.support.v4.view.AccessibilityDelegateCompat.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:358)
       at android.support.v4.view.AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl$1.sendAccessibilityEventUnchecked(AccessibilityDelegateCompat.java:255)
       at android.support.v4.view.AccessibilityDelegateCompatJellyBean$1.sendAccessibilityEventUnchecked(AccessibilityDelegateCompatJellyBean.java:82)
       at android.view.View.sendAccessibilityEventUnchecked(View.java:4959)
       at android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent.run(ViewRootImpl.java:6895)
       at android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent.runOrPost(ViewRootImpl.java:6923)
       at android.view.ViewRootImpl.postSendWindowContentChangedCallback(ViewRootImpl.java:6151)
       at android.view.ViewRootImpl.notifySubtreeAccessibilityStateChanged(ViewRootImpl.java:6224)
       at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:2549)
       at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:2549)
       at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:2549)
       at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:2549)
       at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:2549)
       at android.view.ViewGroup.notifySubtreeAccessibilityStateChanged(ViewGroup.java:2549)
       at android.view.View.notifySubtreeAccessibilityStateChangedIfNeeded(View.java:7343)
       at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3881)
       at android.view.ViewGroup.removeViewAt(ViewGroup.java:3809)
       at android.support.v7.widget.RecyclerView$4.removeViewAt(RecyclerView.java:394)
       at android.support.v7.widget.ChildHelper.removeViewIfHidden(ChildHelper.java:336)
       at android.support.v7.widget.RecyclerView.removeAnimatingView(RecyclerView.java:775)
       at android.support.v7.widget.RecyclerView.access$5300(RecyclerView.java:127)
       at android.support.v7.widget.RecyclerView$ItemAnimatorRestoreListener.onChangeFinished(RecyclerView.java:8278)
       at android.support.v7.widget.RecyclerView$ItemAnimator.dispatchChangeFinished(RecyclerView.java:8590)
       at jp.wasabeef.recyclerview.animators.BaseItemAnimator$5.onAnimationEnd(BaseItemAnimator.java:326)
       at android.support.v4.view.ViewPropertyAnimatorCompatJB$1.onAnimationEnd(ViewPropertyAnimatorCompatJB.java:47)
       at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.java:1030)
       at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1056)
       at android.animation.ValueAnimator.cancel(ValueAnimator.java:969)
       at android.view.ViewPropertyAnimator.cancel(ViewPropertyAnimator.java:412)
       at android.support.v4.view.ViewPropertyAnimatorCompatICS.cancel(ViewPropertyAnimatorCompatICS.java:102)
       at android.support.v4.view.ViewPropertyAnimatorCompat$ICSViewPropertyAnimatorCompatImpl.cancel(ViewPropertyAnimatorCompat.java:438)
       at android.support.v4.view.ViewPropertyAnimatorCompat.cancel(ViewPropertyAnimatorCompat.java:1001)
       at jp.wasabeef.recyclerview.animators.BaseItemAnimator.endAnimation(BaseItemAnimator.java:397)
       at android.support.v7.widget.RecyclerView$Recycler.getScrapViewForPosition(RecyclerView.java:4035)
       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3626)
       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3609)
       at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1859)
       at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:356)
       at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1274)
       at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:525)
       at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:151)
       at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2118)
       at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2415)
       at android.view.View.layout(View.java:14946)
       at android.view.ViewGroup.layout(ViewGroup.java:4651)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
       at android.view.View.layout(View.java:14946)
       at android.view.ViewGroup.layout(ViewGroup.java:4651)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
       at android.view.View.layout(View.java:14946)
       at android.view.ViewGroup.layout(ViewGroup.java:4651)
       at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502)
       at android.view.View.layout(View.java:14946)
       at android.view.ViewGroup.layout(ViewGroup.java:4651)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
       at android.view.View.layout(View.java:14946)
       at android.view.ViewGroup.layout(ViewGroup.java:4651)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
       at android.view.View.layout(View.java:14946)
       at android.view.ViewGroup.layout(ViewGroup.java:4651)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
       at android.view.View.layout(View.java:14946)
       at android.view.ViewGroup.layout(ViewGroup.java:4651)
       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2132)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1075)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5878)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
       at android.view.Choreographer.doCallbacks(Choreographer.java:574)
       at android.view.Choreographer.doFrame(Choreographer.java:544)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:5097)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
       at dalvik.system.NativeStart.main(NativeStart.java)

Remove Animation does not work.

I have the following code in the main fragment :

AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter ( cardAdapter ) ;
alphaAdapter.setDuration (300 );
ScaleInAnimationAdapter scaleInAnimationAdapter = new ScaleInAnimationAdapter ( alphaAdapter ) ;
scaleInAnimationAdapter.setDuration (300 );
recyclerView.setAdapter ( scaleInAnimationAdapter );

When I call the cardAdapter.remove in my class CardAdapter, the animation does not work.

Any suggestions?

Animation issue after calling notifyitemchanged

Hello,
I have compiled the latest recyclerview-animators:2.0.0 and the latest recyclerview-v7:23.1.0.

After calling notifyItemChanged(position) and after that notifyItemRemoved(position) (the position is the same), the remove-animation freezes. (sometimes the item re-appears after the remove-animation over an other item at the same position it was "removed")
I use the simple SlideInLeftAnimator.

Without the animator everything works fine or without calling notifyItemChanged().

java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{40e612c0 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}

crash on android 4.0.4

after adding item and calling notifyItemMoved.
flinging recyclerview crashes app.

java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{40e612c0 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}
at android.support.v7.widget.RecyclerView$4.attachViewToParent(RecyclerView.java:377)
at android.support.v7.widget.ChildHelper.attachViewToParent(ChildHelper.java:208)
at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:4936)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:4913)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:4901)
at android.support.v7.widget.StaggeredGridLayoutManager.fill(StaggeredGridLayoutManager.java:1340)
at android.support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:584)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1988)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2237)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:890)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
at android.view.View.layout(View.java:11425)
at android.view.ViewGroup.layout(ViewGroup.java:4232)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1509)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2498)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4944)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(NativeStart.java)

Item doesn't update sometimes

My app is a chat app and when incoming messages come sometimes the recycler view item is not updated. Am doing a few things. here is the code any help will be appreciated.

public Map findByUserId(String userId) {
HashMap<String, Object> hashMap = null;
if (list != null && !list.isEmpty()) {
for (int i = 0, len = getItemCount(); i < len; i++) {
if (list.get(i) instanceof StatusFeed) {
StatusFeed sf = (StatusFeed) list.get(i);
if (sf.getUserId().equals(userId)) {
hashMap = new HashMap<>();
hashMap.put(Config.KEY, i);
hashMap.put(Config.VALUE, sf);
}
}
}
}
return hashMap;
}

public void updateStatus(Map object, Object item) {

    //find the item in the list which is available in memory
    Map statusMap = findByUserId(((StatusFeed) item).getUserId());

    //convert the object from the server/locally into a hashmap
    HashMap status = Status.setStatus(object);

    //if the item is found, get the position and the item model
    if (statusMap != null) {

        int position = (int) statusMap.get(Config.KEY);
        StatusFeed sf = (StatusFeed) statusMap.get(Config.VALUE);

        //update value in the found list item
        sf.updateFeed(status);

        if (position == 0) {
            updateItem(sf);
        } else {
            moveItem(sf);
        }

    } else {
        addItem(item);
    }

}

Getting type = 0 in my Adapter and crashing the app. Adapter with several view types.

Hi, I'm using the SlideInBottomAnimationAdapter in my Adapter as it is in the documentation:

   vRecyclerView.setAdapter(new SlideInBottomAnimationAdapter(new AlphaInAnimationAdapter(getAdapter())));

But im getting type = 0 in the method onCreateViewHolder from my own adapter:

   @Override
    public PublicationViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
        View v;
        switch (type) {
            case USER_PUBLICATION_TYPE:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_no_images, null);
                return new UserPublicationViewHolder(v);
            case USER_PUBLICATION_TYPE_W_1_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_1_img, null);
                return new UserPublicationSingleImageViewHolder(v);
            case USER_PUBLICATION_TYPE_W_2_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_2_img, null);
                return new UserPublicationTwoImagesViewHolder(v);
            case USER_PUBLICATION_TYPE_W_3_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_3_img, null);
                return new UserPublicationThreeImagesViewHolder(v);
            case USER_PUBLICATION_TYPE_W_4_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_4_img, null);
                return new UserPublicationFourImagesViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_no_images, null);
                return new SocialNetworkPublicationViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_1_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_1_img, null);
                return new SocialNetworkPublicationSingleImageViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_2_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_2_img, null);
                return new SocialNetworkPublicationTwoImagesViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_3_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_3_img, null);
                return new SocialNetworkPublicationThreeImagesViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_4_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_4_img, null);
                return new SocialNetworkPublicationFourImagesViewHolder(v);
            case EVENT_PUBLICATION_TYPE:
                v = LayoutInflater.from(getActivity()).inflate(R.layout.view_holder_event_publication, null);
                return new EventPublicationViewHolder(v);
            case PLACE_PUBLICATION_TYPE:
                v = LayoutInflater.from(getActivity()).inflate(R.layout.view_holder_place_publication, null);
                return new PlacePublicationViewHolder(v);
        }
        throw new RuntimeException("No type matched! Type="+type);
    }

I have several views as you can see but I didn't think that this will be a problem, is theres some work around?

I show you the full adapter but theres nothing from another world. Maybe I need to call some super? But the onCreateViewHolder method is abstract so I know what should I do there.

   public class PublicationAdapter extends RecyclerView.Adapter<PublicationViewHolder> {

    public static final int USER_PUBLICATION_TYPE = 1;
    public static final int EVENT_PUBLICATION_TYPE = 2;
    public static final int PLACE_PUBLICATION_TYPE = 7;
    private static final int USER_PUBLICATION_TYPE_W_1_IMG = 3;
    private static final int USER_PUBLICATION_TYPE_W_2_IMG = 4;
    private static final int USER_PUBLICATION_TYPE_W_3_IMG = 5;
    private static final int USER_PUBLICATION_TYPE_W_4_IMG = 6;
    public static final int SOCIALNETWORK_PUBLICATION_TYPE = 8;
    private static final int SOCIALNETWORK_PUBLICATION_TYPE_W_1_IMG = 9;
    private static final int SOCIALNETWORK_PUBLICATION_TYPE_W_2_IMG = 10;
    private static final int SOCIALNETWORK_PUBLICATION_TYPE_W_3_IMG = 11;
    private static final int SOCIALNETWORK_PUBLICATION_TYPE_W_4_IMG = 12;



    private ArrayList<Publication> publications = new ArrayList<Publication>();

    public ArrayList<Publication> getPublications() {
        return publications;
    }


    public void setPublications(ArrayList<Publication> publications) {
        this.publications = publications;
    }

    @Override
    public int getItemViewType(int position) {
        Publication publication = publications.get(position);
        if (publication instanceof UserPublication) {
            int length = publication.getMedias().size();
            switch (length) {
                case 1:
                    return USER_PUBLICATION_TYPE_W_1_IMG;
                case 2:
                    return USER_PUBLICATION_TYPE_W_2_IMG;
                case 3:
                    return USER_PUBLICATION_TYPE_W_3_IMG;
                case 4:
                    return USER_PUBLICATION_TYPE_W_4_IMG;
                default:
                    if (length > 4) {
                        return USER_PUBLICATION_TYPE_W_4_IMG;
                    }
                    break;
            }
            return USER_PUBLICATION_TYPE;
        }
        if (publication instanceof SocialNetworkPublication) {
            int length = publication.getMedias().size();
            switch (length) {
                case 1:
                    return SOCIALNETWORK_PUBLICATION_TYPE_W_1_IMG;
                case 2:
                    return SOCIALNETWORK_PUBLICATION_TYPE_W_2_IMG;
                case 3:
                    return SOCIALNETWORK_PUBLICATION_TYPE_W_3_IMG;
                case 4:
                    return SOCIALNETWORK_PUBLICATION_TYPE_W_4_IMG;
                default:
                    if (length > 4) {
                        return SOCIALNETWORK_PUBLICATION_TYPE_W_4_IMG;
                    }
                    break;
            }
            return SOCIALNETWORK_PUBLICATION_TYPE;
        }
        if (publication instanceof EventPublication) {
            return EVENT_PUBLICATION_TYPE;
        }
        if(publication instanceof PlacePublication){
            return PLACE_PUBLICATION_TYPE;
        }
        throw new RuntimeException("Unknown view type in PublicationAdapter");
    }

    @Override
    public PublicationViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
        View v;
        switch (type) {
            case USER_PUBLICATION_TYPE:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_no_images, null);
                return new UserPublicationViewHolder(v);
            case USER_PUBLICATION_TYPE_W_1_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_1_img, null);
                return new UserPublicationSingleImageViewHolder(v);
            case USER_PUBLICATION_TYPE_W_2_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_2_img, null);
                return new UserPublicationTwoImagesViewHolder(v);
            case USER_PUBLICATION_TYPE_W_3_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_3_img, null);
                return new UserPublicationThreeImagesViewHolder(v);
            case USER_PUBLICATION_TYPE_W_4_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_4_img, null);
                return new UserPublicationFourImagesViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_no_images, null);
                return new SocialNetworkPublicationViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_1_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_1_img, null);
                return new SocialNetworkPublicationSingleImageViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_2_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_2_img, null);
                return new SocialNetworkPublicationTwoImagesViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_3_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_3_img, null);
                return new SocialNetworkPublicationThreeImagesViewHolder(v);
            case SOCIALNETWORK_PUBLICATION_TYPE_W_4_IMG:
                v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.view_holder_user_publication_w_4_img, null);
                return new SocialNetworkPublicationFourImagesViewHolder(v);
            case EVENT_PUBLICATION_TYPE:
                v = LayoutInflater.from(getActivity()).inflate(R.layout.view_holder_event_publication, null);
                return new EventPublicationViewHolder(v);
            case PLACE_PUBLICATION_TYPE:
                v = LayoutInflater.from(getActivity()).inflate(R.layout.view_holder_place_publication, null);
                return new PlacePublicationViewHolder(v);
        }
        throw new RuntimeException("No type matched! Type="+type);
    }

    private static final String INTERACTION_LIKE = "LIKE";
    private static final String INTERACTION_DISLIKE = "DISLIKE";
    private static final String INTERACTION_LOVE = "LOVE";
    private static final String INTERACTION_NONE = "";

    @Override
    public void onBindViewHolder(final PublicationViewHolder aPublicationHolder, int i) {
        switch (publications.get(i).getType()) {
            case Publication.TYPE_SOCIAL_NETWORK_PUBLICATION:
                bindSocialNetworkPublicationCallbacks(aPublicationHolder, i);
                aPublicationHolder.load(publications.get(i), FeedFragment.this);
                break;
            case Publication.TYPE_USER_PUBLICATION:
                bindUserPublicationCallbacks(aPublicationHolder, i);
                aPublicationHolder.load(publications.get(i), FeedFragment.this);
            break;
            case Publication.TYPE_EVENT_PUBLICATION:
                bindEventPublicationCallbacks(aPublicationHolder, i);
                aPublicationHolder.load(publications.get(i), FeedFragment.this);
            break;
            case Publication.TYPE_PLACE_PUBLICATION:
                bindPlacePublicationCallbacks(aPublicationHolder, i);
                aPublicationHolder.load(publications.get(i), FeedFragment.this);
            break;
        }
        if (i == 0) {
            onFirstViewHolderBinded(aPublicationHolder);
        }
    }

    private void bindPlacePublicationCallbacks(PublicationViewHolder aPublicationHolder, int i) {
        final PlacePublication publication = (PlacePublication) publications.get(i);
        aPublicationHolder.load(publication,
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onLikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onDislikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onFavoriteClicked(publication);
                    }
                }, FeedFragment.this);
    }

    private void bindEventPublicationCallbacks(PublicationViewHolder aPublicationHolder, int i) {
        final EventPublication publication = (EventPublication) publications.get(i);
        aPublicationHolder.load(publication,
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onLikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onDislikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onFavoriteClicked(publication);
                    }
                }, FeedFragment.this);
    }

    private void bindUserPublicationCallbacks(PublicationViewHolder aPublicationHolder, int i) {
        final UserPublication publication = (UserPublication) publications.get(i);
        aPublicationHolder.load(publication,
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onLikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onDislikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onFavoriteClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onEditPostClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onDeletePostClicked(publication);
                    }
                },
                new TagCloudLocationFriends.OnTagSelectListener() {
                    @Override
                    public void onTagSelected(MinikastTag tag, int position) {
                        if(tag.getType() == 2){
                            GoTo.placeDetail(getActivity(), publication.getLocation().getId(), publication.getLocation().getName());
                        }else if (tag.getType() == 3){
                            User aUser = new User(-1);
                            aUser.setProfileId(String.valueOf(tag.getUserID()));
                            GoTo.user(getActivity(), aUser);
                        }
                    }
                }, FeedFragment.this);
    }

    private void bindSocialNetworkPublicationCallbacks(PublicationViewHolder aPublicationHolder, int i) {
        final SocialNetworkPublication publication = (SocialNetworkPublication) publications.get(i);
        aPublicationHolder.load(publication,
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onLikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onDislikeClicked(publication);
                    }
                },
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onFavoriteClicked(publication);
                    }
                },
                new TagCloudLocationFriends.OnTagSelectListener() {
                    @Override
                    public void onTagSelected(MinikastTag tag, int position) {
                        if(tag.getType() == 2){
                            GoTo.placeDetail(getActivity(), publication.getLocation().getId(), publication.getLocation().getName());
                        }else if (tag.getType() == 3){
                            User aUser = new User(-1);
                            aUser.setProfileId(String.valueOf(tag.getUserID()));
                            GoTo.user(getActivity(), aUser);
                        }
                    }
                }, FeedFragment.this);
    }

    private void onDeletePostClicked(UserPublication publication) {
        showDialogDeletePost(publication.getId(), mCurrentPosts.indexOf(publication));
    }

    private void onEditPostClicked(UserPublication publication) {
        GoTo.editPost(getActivity(), publication);
    }

    private void removeInteraction(Publication publication, String oldInteraction){
        RemovePostInteraction operation = new RemovePostInteraction(publication, String.valueOf(publication.getId()), StartupSharedPreferences.getUserId(), oldInteraction);
        operation.setmToken(getToken());
        sendOperationRequest(operation);
    }

    private void addInteraction(Publication publication, String newInteraction){
        SavePostInteractionOperation operation = new SavePostInteractionOperation(publication, String.valueOf(publication.getId()), StartupSharedPreferences.getUserId(), newInteraction);
        operation.setmToken(getToken());
        sendOperationRequest(operation);
    }

    private void onLikeClicked(Publication publication) {
        if(publication.getRelationship().equals(INTERACTION_LIKE)){
            publication.setRelationship(INTERACTION_NONE);
            removeInteraction(publication, INTERACTION_LIKE);
        }else{
            publication.setRelationship(INTERACTION_LIKE);
            addInteraction(publication, INTERACTION_LIKE);
        }
    }

    private void onFavoriteClicked(Publication publication) {
        if(publication.getRelationship().equals(INTERACTION_LOVE)){
            publication.setRelationship(INTERACTION_NONE);
            removeInteraction(publication, INTERACTION_LOVE);
        }else{
            publication.setRelationship(INTERACTION_LOVE);
            addInteraction(publication, INTERACTION_LOVE);
        }
    }

    private void onDislikeClicked(Publication publication) {
        if(publication.getRelationship().equals(INTERACTION_DISLIKE)){
            publication.setRelationship(INTERACTION_NONE);
            removeInteraction(publication, INTERACTION_DISLIKE);
        }else{
            publication.setRelationship(INTERACTION_DISLIKE);
            addInteraction(publication, INTERACTION_DISLIKE);
        }
    }

    @Override
    public long getItemId(int position) {
       return publications.get(position).getId();
    }

    @Override
    public int getItemCount() {
        return publications.size();
    }

    public void updatePublication(Publication modifP) {
        int idx = publications.indexOf(modifP);
        publications.set(idx, modifP);
    }
}

I also set the hasStableItems to true. I still can call the super.getItemViewType() but if I do so, It will still crach in the onCreateViewHolder

No animation when i add or remove item

I copied your sample but when I run it in my phone,there is no animation or view change when i click "ADD" or "DEL" TextView,I should slide it up and down to see result.

No animation when using with cursor

Hello,
First of all, this is a really nice project and initiative. Congrats!
I tested with using an ArrayList as Dataset and worked just fine. But when I tried to implement in my project, where I use a cursor as data, no animation played (except the adapter animation, with was a little buggy).
I don't know if is a problem, but I'm just notifying the adapter with: notifyDataSetChanged()

RecyclerView Declaration and setup:

// Cursor Adapter  
 recyclerAdapterDetail   = new DetailTaskRecyclerAdapter( getActivity(), null );
 recyclerViewDetail      = (RecyclerView)       fragmentView.findViewById(R.id.fragment_detail_recyclerview);

  LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
  linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

  recyclerViewDetail.setItemAnimator(new FadeInAnimator());
  recyclerViewDetail.getItemAnimator().setAddDuration( 1000 );
  recyclerViewDetail.setLayoutManager(linearLayoutManager);

  recyclerViewDetail.setAdapter( recyclerAdapterDetail );

Notifying part on the adapter:

public Cursor swapCursor(Cursor cursor) {
    if (this.cursor == cursor) {
        return null;
    }
    Cursor oldCursor = this.cursor;
    this.cursor = cursor;
    if (cursor != null) {
        this.notifyDataSetChanged();
    }
    return oldCursor;
}

i can't use this library

i want use this library but i can't use :( .
i added this code : compile 'jp.wasabeef:recyclerview-animators:1.3.0'
and added this code to my activity :
mRecyclerView = (RecyclerView) findViewById(R.id.profile_user_recycler);

    mRecyclerView.setItemAnimator(new SlideInUpAnimator(new OvershootInterpolator(1f)));
    mRecyclerView.getItemAnimator().setAddDuration(1000);
    mRecyclerView.getItemAnimator().setRemoveDuration(1000);
    mRecyclerView.getItemAnimator().setMoveDuration(1000);
    mRecyclerView.getItemAnimator().setChangeDuration(1000);

    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mAdapter = new profile_user_adapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);

please help me, i really need this library. tnx <3

Removal animation does not working

I have following codes:

RecyclerView mailList;
.......
mailList.setItemAnimator(new SlideInRightAnimator());
mailList.getItemAnimator().setAddDuration(200);
mailList.getItemAnimator().setRemoveDuration(200);
......

Although addition animation is woking, removal animation is not working

Allow resetting the lastPosition so rows animate again

I have an infinite scroll implementation in place, which works wonderfully with this library. I also have pull to refresh setup, and I noticed that after I pull to refresh and all of my items are freshly re-populated...the rows don't animate anymore as they're revealed.

I believe this is due to the mLastPosition variable remembering the value from before the pull to refresh, so ideally I'd like a way to reset that back down to -1 so that views are animated again.

Is there support for this functionality already that I'm overlooking?

Can't get this to work. Missing documentation?

Hi, by just following your readme nothing happens when I add one of your ItemAnimators. Is there maybe documentation missing?

Is it necessary to set a duration? Is it necessary to always call notifyItemInserted() or notifyItemRemoved()?

Fade out each element after 10 secends

Hello

I have question. It iposible to fadeout each new elemnt after couple of seconde without remove it? The same effect like in periscope app chat message.

Adapters not working

I couldn't get the adapters to work, at least not with the instructions provided.
Seeing the difficulties some of us have encountered, maybe a troubleshooting section could be helpful.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.