Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 161abf3d authored by Adam Powell's avatar Adam Powell
Browse files

Fix a bug with deferred position scrolling in lists while data changes

are pending

Save the pending position scroll until the data change is actually
serviced before posting it to run. This avoids handler loops on
GONE subtrees or when the view is detached.

Bug 6547649

Change-Id: Iab108cfcb7dd11ece703762d311a5f5985f38c3b
parent 101fb9fe
Loading
Loading
Loading
Loading
+8 −6
Original line number Original line Diff line number Diff line
@@ -579,6 +579,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
    private InputConnectionWrapper mPublicInputConnection;
    private InputConnectionWrapper mPublicInputConnection;


    private Runnable mClearScrollingCache;
    private Runnable mClearScrollingCache;
    Runnable mPositionScrollAfterLayout;
    private int mMinimumVelocity;
    private int mMinimumVelocity;
    private int mMaximumVelocity;
    private int mMaximumVelocity;
    private float mVelocityScale = 1.0f;
    private float mVelocityScale = 1.0f;
@@ -1910,6 +1911,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
        removeAllViewsInLayout();
        removeAllViewsInLayout();
        mFirstPosition = 0;
        mFirstPosition = 0;
        mDataChanged = false;
        mDataChanged = false;
        mPositionScrollAfterLayout = null;
        mNeedSync = false;
        mNeedSync = false;
        mOldSelectedPosition = INVALID_POSITION;
        mOldSelectedPosition = INVALID_POSITION;
        mOldSelectedRowId = INVALID_ROW_ID;
        mOldSelectedRowId = INVALID_ROW_ID;
@@ -4248,11 +4250,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te


            if (mDataChanged) {
            if (mDataChanged) {
                // Wait until we're back in a stable state to try this.
                // Wait until we're back in a stable state to try this.
                post(new Runnable() {
                mPositionScrollAfterLayout = new Runnable() {
                    @Override public void run() {
                    @Override public void run() {
                        start(position);
                        start(position);
                    }
                    }
                });
                };
                return;
                return;
            }
            }


@@ -4299,11 +4301,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te


            if (mDataChanged) {
            if (mDataChanged) {
                // Wait until we're back in a stable state to try this.
                // Wait until we're back in a stable state to try this.
                post(new Runnable() {
                mPositionScrollAfterLayout = new Runnable() {
                    @Override public void run() {
                    @Override public void run() {
                        start(position, boundPosition);
                        start(position, boundPosition);
                    }
                    }
                });
                };
                return;
                return;
            }
            }


@@ -4376,11 +4378,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
            if (mDataChanged) {
            if (mDataChanged) {
                // Wait until we're back in a stable state to try this.
                // Wait until we're back in a stable state to try this.
                final int postOffset = offset;
                final int postOffset = offset;
                post(new Runnable() {
                mPositionScrollAfterLayout = new Runnable() {
                    @Override public void run() {
                    @Override public void run() {
                        startWithOffset(position, postOffset, duration);
                        startWithOffset(position, postOffset, duration);
                    }
                    }
                });
                };
                return;
                return;
            }
            }


+4 −0
Original line number Original line Diff line number Diff line
@@ -1275,6 +1275,10 @@ public class GridView extends AbsListView {


            mLayoutMode = LAYOUT_NORMAL;
            mLayoutMode = LAYOUT_NORMAL;
            mDataChanged = false;
            mDataChanged = false;
            if (mPositionScrollAfterLayout != null) {
                post(mPositionScrollAfterLayout);
                mPositionScrollAfterLayout = null;
            }
            mNeedSync = false;
            mNeedSync = false;
            setNextSelectedPositionInt(mSelectedPosition);
            setNextSelectedPositionInt(mSelectedPosition);


+4 −0
Original line number Original line Diff line number Diff line
@@ -1691,6 +1691,10 @@ public class ListView extends AbsListView {
            
            
            mLayoutMode = LAYOUT_NORMAL;
            mLayoutMode = LAYOUT_NORMAL;
            mDataChanged = false;
            mDataChanged = false;
            if (mPositionScrollAfterLayout != null) {
                post(mPositionScrollAfterLayout);
                mPositionScrollAfterLayout = null;
            }
            mNeedSync = false;
            mNeedSync = false;
            setNextSelectedPositionInt(mSelectedPosition);
            setNextSelectedPositionInt(mSelectedPosition);