over 2 years ago

我們要知道一件事情啦! RecyclerView沒有對於Item做任何的改變,
簡單的說,我們的Layout編排,都是靠LayoutManager去做修改,因此我們需要對於LayoutManager做運算。

所以我們得手動更改onMeasure,以下為LinearLayoutManager做範例。

public class WrapContentLinearLayout extends LinearLayoutManager {

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

    public WrapContentLinearLayout(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    public WrapContentLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
        //super.onMeasure(recycler, state, widthSpec, heightSpec);

        View view = recycler.getViewForPosition(0);

        if(view != null){

            measureChild(view, widthSpec, heightSpec); //計算View的高寬

            
            //int measuredWidth = getItemCount() * view.getMeasuredWidth(); //這不用解釋啦?

            int measuredWidth = getItemCount() * view.getMeasuredWidth() > View.MeasureSpec.getSize(widthSpec) ? View.MeasureSpec.getSize(widthSpec) : getItemCount() * view.getMeasuredWidth();
            int measuredHeight = view.getMeasuredHeight(); //這個還要解釋? 

            
            setMeasuredDimension(measuredWidth, measuredHeight);

        }
    }
}

上面可以看到我註解掉一行,那一行是錯誤的,會導致橫向不能滑動。

所以正確解法應該是以下方法:

measuredWidth = getItemCount() * view.getMeasuredWidth() > View.MeasureSpec.getSize(widthSpec) ? View.MeasureSpec.getSize(widthSpec) : getItemCount() * view.getMeasuredWidth();

如果全部的ItemView寬度大於RecyclerView的寬度就使用原先的寬度,反之就使用我們ItemView的寬度,如此一來就解決了。

然後就...江...上面這方法聽說不是很準確的抓到高寬度,但我覺得夠用了!
反正使用者又看不太出來(感覺要被打了...)。

以上為今日不負責任教學講座,請看好看滿。

← [Java] 來看看 Try Catch 吧! [Android] 讓Spinner Item可重複(Repeat)點擊 →
 
comments powered by Disqus