flschweiger / SwipeStack

A simple, customizable and easy to use swipeable view stack for Android.
Apache License 2.0
1.48k stars 222 forks source link

ViewPager inside adapter #68

Open panekzogen opened 5 years ago

panekzogen commented 5 years ago

Hello.

I don't have a strong knowledge about view processing in android but maybe this helps someone because library seems unsupported. If someone want to create complex layout, in my case it was ViewPager inside adapter of swipe stack, note that the layout processing doing in wrong order: At SwipeStack.addNewView() which called on onLayout() for children nodes performing following:

bottomView.measure(measureSpecWidth | width, measureSpecHeight | height);
addViewInLayout(bottomView, 0, params, true);

But after several hours of reviewing android code and googling i found that right order is:

addView(bottomView, 0, params);
bottomView.measure(measureSpecWidth | width, measureSpecHeight | height);
bottomView.layout(0, 0, width, height);

If someone has deep knowledge about it and know on what exactly it affects, please explain. Hope that it helps someone.

panekzogen commented 5 years ago

Second issue which i found: onMeasure override is not correct without measuring children

For measure all components onMeasure method should be overridden as follow

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(width, height);

        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            measureChild(child, widthMeasureSpec, heightMeasureSpec);
        }
    }
Johnett commented 5 years ago

Thank you for taking the time to post these fixes. It'll definitely help someone.