This question has been asked many times but it just doesn't seem to have a solution that fits my requirement.

I have a Recipe that has instructions. Each instruction is ordered in a `RecyclerView`. The order must be from top to bottom. It cannot be reversed like many answers to this question.

I have an Add button that when clicked a new item is added at the bottom of the list. I need to scroll to the new item after the insert. So I employed the following code in the button's `onClick` event:

```
mRecyclerAdapter.addItem(newInstruction);
mRecyclerView.smoothScrollToPosition(mRecyclerAdapter.getItemCount() - 1);

```

This scrolls to the second last item because in the adapter's **addItem()** method I have this:

```
mItems.add(item);
notifyItemInserted(getItemCount() - 1);

```

I don't know the details of the `notifyItemInserted()` call, but it appears to be on a separate thread, which means that `smoothScrollToPosition()` is called before the views have been laid out after the insertion. Hence, it only scrolls to the second last item.

I have tried looking for a "callback" function along the lines of `onItemInserted` but I did not have any luck. eg, no answer [Here](https://stackoverflow.com/questions/34350970/callback-on-notifyiteminserted-notifyitemremoved-notifyitemmoved).

How do I solve this problem?

***EDIT START***

I've simplified the code in a new project in hope to find the problem, and found out what the problem is. It appears to be a problem caused by CoordinatorLayout/AppBarLayout when scrolling flag is enabled. It seems as though the scrolling did not take into consideration the extra scrolling space added by the AppBarLayout.

In the sample codes below, if you disable the scrolling flag for the app bar, scrolling to the bottom of the screen works perfectly as intended. However, if you enable the AppBarLayout scrolling behavior, and change its height, you'll notice that scrolling to the bottom is off by the given height.

I need the scrolling behavior, so how do I make them play nicely with each other? Please note that I've changed the question to reflect the problem.

**MainActivity.java**

```
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public static final int ITEMS_COUNT = 50;

    private FloatingActionButton mFloatingActionButton;
    private RecyclerView mRecyclerView;
    private RecyclerAdapter mRecyclerAdapter;

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

        mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fabButton);
        mFloatingActionButton.setOnClickListener(this);

        setupRecyclerView();
    }

    private void setupRecyclerView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerAdapter = new RecyclerAdapter(createItemList());
        mRecyclerView.setAdapter(mRecyclerAdapter);
    }

    private List<String> createItemList() {
        List<String> itemList = new ArrayList<>();
            for (int i = 0; i < ITEMS_COUNT; i++) {
                itemList.add("Item " + i);
            }
        return itemList;
    }

    @Override
    public void onClick(View v) {
        mRecyclerView.scrollToPosition(49);
    }
}

```

**activity\_main.xml**

```
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <!-- changing the height affects the scrolling distance -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:text="Header"
            app:layout_scrollFlags="scroll|enterAlways"/> <!--   this is the problem -->

    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fabButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="20dp"/>

</android.support.design.widget.CoordinatorLayout>

```

**RecyclerAdapter.java**

```
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<String> mItemList;

    public RecyclerAdapter(List<String> itemList) {
        mItemList = itemList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View view = LayoutInflater.from(context).inflate(R.layout.recycler_item, parent, false);
        return RecyclerItemViewHolder.newInstance(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        RecyclerItemViewHolder holder = (RecyclerItemViewHolder) viewHolder;
        String itemText = mItemList.get(position);
        holder.setItemText(itemText);
    }

    @Override
    public int getItemCount() {
        return mItemList == null ? 0 : mItemList.size();
    }

}

```

**recycler\_item.xml**

```
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
                                    xmlns:card_view="http://schemas.android.com/apk/res-auto"
                                    android:layout_width="match_parent"
                                    android:layout_height="wrap_content"
                                    android:layout_gravity="center"
                                    android:layout_margin="8dp"
                                    card_view:cardCornerRadius="4dp">
    <TextView
        android:id="@+id/itemTextView"
        android:layout_width="match_parent"
        android:layout_height="?attr/listPreferredItemHeight"
        android:gravity="center_vertical"
        android:padding="8dp"
        style="@style/Base.TextAppearance.AppCompat.Body2"/>
</android.support.v7.widget.CardView>

```

**EDIT END**