ViewPager의 진정한 사용자 적응 높이

4334 단어 android
ViewPager 컨트롤, 제가 예전에 했던 방법은 모두 높이를 직접 쓰는 것이었습니다. 이것은 광고 스크롤 그림을 만드는 데 괜찮습니다. 높이가 16:9이기 때문에 죽어도 괜찮습니다.그러나 동적 데이터 목록을 표시하는 데는 이미 수요를 만족시키지 못한다.
다른 대부분의 컨트롤의 적응은 이 wrap콘텐츠 속성은 해결할 수 있지만 ViewPager에게는 효과가 없고 높이를 설정하지 않으면 디스플레이 처리를 하지 않는다. 내가 생각한 해결 방법은 onMeasure 방법을 다시 쓰는 것이다.
원리: 하위 컨트롤의 높이를 가져오면 ViewPager의 높이를 재설정할 수 있습니다.
첫 번째 방법은 ViewPager의 하위 컨트롤을 훑어보고 하위 컨트롤의 가장 큰 Height 값을 가져와 ViewPager의 높이를 완성하는 것이다. 그러나 데이터가 적은 View 밑에 큰 공백이 생겨 우호적인 사용자 체험을 만족시키지 못한다.
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if (h > height)
                height = h;
        }
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

두 번째 방법은 하위 컨트롤의 색인에 따라 현재 표시된 하위 컨트롤의 높이를 직접 가져오고 ViewPager의 높이를 재설정하는 것이다.구체적인 코드는 다음과 같다.
public class WrapContentHeightViewPager extends ViewPager {

    private int currentIndex;
    private int height = 0;
    //  view     
    private HashMap mChildrenViews = new LinkedHashMap();


    public WrapContentHeightViewPager(Context context) {
        super(context);
    }

    public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mChildrenViews.size() > currentIndex) {
            View child = mChildrenViews.get(currentIndex);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            height = child.getMeasuredHeight();
        }
        if (mChildrenViews.size() != 0) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     *       
     *
     * @param current
     */
    public void resetHeight(int current) {
        currentIndex = current;
        if (mChildrenViews.size() > current) {
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
            if (layoutParams == null) {
                layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
            } else {
                layoutParams.height = height;
            }
            setLayoutParams(layoutParams);
        }
    }

    /**
     *   View     ,               
     */
    public void setViewForPosition(View view, int position) {
        mChildrenViews.put(position, view);
    }
}

사용법은 ViewPager의 슬라이딩 감청 이벤트를 실현하고 슬라이딩 후 현재 하위 컨트롤의 인덱스에 따라 들어오고 높이를 다시 설정하려면 기본값이 필요합니다
private void initViewPagerListener() {
        mViewPagerView.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                mViewPagerView.resetHeight(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        mViewPagerView.resetHeight(0);
}

사실 위 reset Height 안의 높이가 무엇이든 상관없습니다. set Layout Params를 실행하면 onMeasure 방법을 터치하기 때문입니다. onMeasure 방법에는 현재 하위 컨트롤의 높이를 가져와 ViewPager에 다시 설정하는 처리가 있습니다.
특히 주의: 높이에 맞게 하위 컨트롤, 하위 컨트롤, 하위 컨트롤에 setViewForPosition을 설정해야 합니다
 /**
     *        
     * @param mViewPagerView
     */
    public void setWrapContentHeightViewPager(WrapContentHeightViewPager mViewPagerView) {
        mViewPagerView.setViewForPosition(this,0);
    }

많은 사람들이 백자 컨트롤을 알지 못하기 때문에 다음과 같은 내용을 보충합니다.
ViewPager 데이터는 List list = new Array List < ();
내가 말한 하위 컨트롤은 사용자 정의 뷰입니다. 사용자 정의 뷰에 setWrap Content Height ViewPager를 설정하고 ViewPager를 불러와서 현재 사용자 정의 View의 인덱스를 설정합니다.

좋은 웹페이지 즐겨찾기