AnimateLayoutChanges doesn't work with RecyclerView

Buntupana

I have a screen with a Recyclerview and others Elements inside of LinearLayout. The problem is when I remove a item of the RecyclerView, animateLayoutChanges doesn't work in this case. Does anayone know why this happen??

Demo

XML

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.alvaro.resizetest.MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:id="@+id/test1"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorAccent"
        android:gravity="center_vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="LinearLayout"
            android:textColor="#FFFFFF"
            android:textSize="22sp"/>
    </LinearLayout>


    <LinearLayout
        android:id="@+id/test2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimaryDark"
        android:gravity="center_vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="LinearLayout"
            android:textColor="#FFFFFF"
            android:textSize="22sp"/>
    </LinearLayout>


    <LinearLayout
        android:id="@+id/test3"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorAccent"
        android:gravity="center_vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="LinearLayout"
            android:textColor="#FFFFFF"
            android:textSize="22sp"/>
    </LinearLayout>


    <LinearLayout
        android:id="@+id/test4"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimaryDark"
        android:gravity="center_vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="LinearLayout"
            android:textColor="#FFFFFF"
            android:textSize="22sp"/>
    </LinearLayout>


</LinearLayout>

JAVA

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);

    Adapter adapter = new Adapter();

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);
    recyclerView.setNestedScrollingEnabled(true);

    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            view.setVisibility(View.GONE);
        }
    };

    findViewById(R.id.test1).setOnClickListener(listener);
    findViewById(R.id.test2).setOnClickListener(listener);
    findViewById(R.id.test3).setOnClickListener(listener);
    findViewById(R.id.test4).setOnClickListener(listener);

}


class Adapter extends RecyclerView.Adapter<Adapter.Holder>{

    int size = 3;

    public Adapter() {
    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = getLayoutInflater().inflate(R.layout.item, parent, false);

        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(Holder holder, int position) {

    }

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

    class Holder extends RecyclerView.ViewHolder {

        public Holder(final View itemView) {
            super(itemView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    size --;
                    notifyItemRemoved(getAdapterPosition());
                }
            });

        }
    }
}
Buntupana

After a while I got a solution. I made a function to animate the recyclerView height.

enter image description here

JAVA

public class MainActivity extends AppCompatActivity {

private final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);

    Adapter adapter = new Adapter(recyclerView);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this) {
        @Override
        public boolean canScrollVertically() {
            return false;
        }
    };

    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(adapter);
    recyclerView.setNestedScrollingEnabled(true);

    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            view.setVisibility(View.GONE);
        }
    };

    findViewById(R.id.test1).setOnClickListener(listener);
    findViewById(R.id.test2).setOnClickListener(listener);
    findViewById(R.id.test3).setOnClickListener(listener);
    findViewById(R.id.test4).setOnClickListener(listener);

}


public void animateHeight(final View v, final int height) {

    final int initialHeight = v.getMeasuredHeight();
    int duration = 500;
    Interpolator interpolator = new AccelerateInterpolator(2);

    // I have to set the same height before the animation because there is a glitch
    // in the beginning of the animation
    v.getLayoutParams().height = initialHeight;
    v.requestLayout();

    Animation a = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            Log.d(TAG, "InterpolatedTime: " + interpolatedTime);
            Log.d(TAG, "Collapsing height: " + (initialHeight - (int) (height * interpolatedTime)));
            v.getLayoutParams().height = initialHeight - (int) (height * interpolatedTime);
            v.requestLayout();
        }

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

    a.setDuration(duration);
    a.setInterpolator(interpolator);
    v.startAnimation(a);
}


class Adapter extends RecyclerView.Adapter<Adapter.Holder> {

    RecyclerView mRecyclerView;
    int size = 3;

    public Adapter(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = getLayoutInflater().inflate(R.layout.item, parent, false);

        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(Holder holder, int position) {

    }

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

    class Holder extends RecyclerView.ViewHolder {

        public Holder(final View itemView) {
            super(itemView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    size--;
                    notifyItemRemoved(getAdapterPosition());
                    animateHeight((View) itemView.getParent(), itemView.getMeasuredHeight());
                }
            });

        }
    }
}

}

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Recyclerview android doesn't work

From Dev

(Smooth)ScrollToPosition doesn't work properly with RecyclerView

From Java

How to scroll to the bottom of a RecyclerView? scrollToPosition doesn't work

From Dev

Loading Bitmaps doesn't work correct, while scrolling in RecyclerView

From Dev

Child RecyclerView's onBindViewHolder doesn't work on my Nested RecyclerView Project in Android

From Dev

RecyclerView don't work

From Dev

RecyclerView doesn't scroll

From Dev

Does 'android:animateLayoutChanges="true" ' Still work

From Java

Why doesn't smooth scroll of RecyclerView work well with some Interpolator classes?

From Dev

RecyclerView item onClickListener doesn't work on a first click, but works on a second one

From Java

RecyclerView doesn't set adapter

From Dev

CollapsingToolbarLayout doesn't show the RecyclerView

From Dev

RecyclerView doesn't display anything

From Dev

notifyDataSetChanged doesn't refresh RecyclerView

From Dev

RecyclerView doesn't update at all

From Dev

RecyclerView doesn't set adapter

From Dev

CollapsingToolbarLayout doesn't show the RecyclerView

From Dev

FileFilter doesn't work

From Dev

Futuretask doesn't work

From Dev

Alias doesn't work

From Dev

ExpandableListView doesn't work

From Dev

GeoFencing doesn't work

From Dev

setRightBarButtonItems doesn't work

From Dev

HttpSessionListener doesn't work

From Dev

Forget doesn't work

From Dev

requestSingleUpdate doesn't work :(

From Dev

RStudio doesn't work

From Dev

glReadPixels doesn't work

From Dev

glDrawArrays() doesn't work