Skip to content
This repository has been archived by the owner on Jul 14, 2021. It is now read-only.

fix(setNoScrolling): 解决VirtualLayoutManager.setNoScrolling(让recyclerView绘制所有item)不生效,并且无限循环onMeasure问题 #507

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,6 @@

package com.alibaba.android.vlayout.example;

import com.alibaba.android.vlayout.DelegateAdapter;
import com.alibaba.android.vlayout.LayoutHelper;
import com.alibaba.android.vlayout.RecyclablePagerAdapter;
import com.alibaba.android.vlayout.VirtualLayoutManager;
import com.alibaba.android.vlayout.VirtualLayoutManager.LayoutParams;
import com.alibaba.android.vlayout.extend.LayoutManagerCanScrollListener;
import com.alibaba.android.vlayout.extend.PerformanceMonitor;
import com.alibaba.android.vlayout.extend.ViewLifeCycleListener;
import com.alibaba.android.vlayout.layout.ColumnLayoutHelper;
import com.alibaba.android.vlayout.layout.FixLayoutHelper;
import com.alibaba.android.vlayout.layout.FloatLayoutHelper;
import com.alibaba.android.vlayout.layout.GridLayoutHelper;
import com.alibaba.android.vlayout.layout.LinearLayoutHelper;
import com.alibaba.android.vlayout.layout.OnePlusNLayoutHelper;
import com.alibaba.android.vlayout.layout.RangeGridLayoutHelper;
import com.alibaba.android.vlayout.layout.RangeGridLayoutHelper.GridRangeStyle;
import com.alibaba.android.vlayout.layout.ScrollFixLayoutHelper;
import com.alibaba.android.vlayout.layout.SingleLayoutHelper;
import com.alibaba.android.vlayout.layout.StaggeredGridLayoutHelper;
import com.alibaba.android.vlayout.layout.StickyLayoutHelper;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
Expand All @@ -59,15 +38,34 @@
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.EditText;
import android.widget.TextView;

import java.util.ArrayList;
import com.alibaba.android.vlayout.DelegateAdapter;
import com.alibaba.android.vlayout.LayoutHelper;
import com.alibaba.android.vlayout.RecyclablePagerAdapter;
import com.alibaba.android.vlayout.VirtualLayoutManager;
import com.alibaba.android.vlayout.VirtualLayoutManager.LayoutParams;
import com.alibaba.android.vlayout.extend.LayoutManagerCanScrollListener;
import com.alibaba.android.vlayout.extend.PerformanceMonitor;
import com.alibaba.android.vlayout.extend.ViewLifeCycleListener;
import com.alibaba.android.vlayout.layout.ColumnLayoutHelper;
import com.alibaba.android.vlayout.layout.FixLayoutHelper;
import com.alibaba.android.vlayout.layout.FloatLayoutHelper;
import com.alibaba.android.vlayout.layout.GridLayoutHelper;
import com.alibaba.android.vlayout.layout.LinearLayoutHelper;
import com.alibaba.android.vlayout.layout.OnePlusNLayoutHelper;
import com.alibaba.android.vlayout.layout.RangeGridLayoutHelper;
import com.alibaba.android.vlayout.layout.RangeGridLayoutHelper.GridRangeStyle;
import com.alibaba.android.vlayout.layout.ScrollFixLayoutHelper;
import com.alibaba.android.vlayout.layout.SingleLayoutHelper;
import com.alibaba.android.vlayout.layout.StaggeredGridLayoutHelper;
import com.alibaba.android.vlayout.layout.StickyLayoutHelper;

import java.util.LinkedList;
import java.util.List;

Expand All @@ -76,23 +74,25 @@
*/
public class VLayoutActivity extends Activity {

private static final boolean TEST_NO_SCROLLING = false;

private static final boolean BANNER_LAYOUT = true;

private static final boolean FIX_LAYOUT = true;
private static final boolean FIX_LAYOUT = true && !TEST_NO_SCROLLING;

private static final boolean LINEAR_LAYOUT = true;

private static final boolean SINGLE_LAYOUT = true;

private static final boolean FLOAT_LAYOUT = true;
private static final boolean FLOAT_LAYOUT = true && !TEST_NO_SCROLLING;

private static final boolean ONEN_LAYOUT = true;

private static final boolean COLUMN_LAYOUT = true;

private static final boolean GRID_LAYOUT = true;

private static final boolean STICKY_LAYOUT = true;
private static final boolean STICKY_LAYOUT = true && !TEST_NO_SCROLLING;

private static final boolean STAGGER_LAYOUT = true;

Expand All @@ -110,10 +110,14 @@ public class VLayoutActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
if (TEST_NO_SCROLLING) {
setContentView(R.layout.main_noscroll_activity);
} else {
setContentView(R.layout.main_activity);
}

mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
;

mFirstText = (TextView) findViewById(R.id.first);
mLastText = (TextView) findViewById(R.id.last);
mCountText = (TextView) findViewById(R.id.count);
Expand All @@ -122,6 +126,11 @@ protected void onCreate(Bundle savedInstanceState) {
final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.main_view);

final VirtualLayoutManager layoutManager = new VirtualLayoutManager(this);

if (TEST_NO_SCROLLING) {
layoutManager.setNoScrolling(true);
}

layoutManager.setPerformanceMonitor(new PerformanceMonitor() {

long start;
Expand Down
107 changes: 107 additions & 0 deletions examples/src/main/res/layout/main_noscroll_activity.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ MIT License
~
~ Copyright (c) 2016 Alibaba Group
~
~ Permission is hereby granted, free of charge, to any person obtaining a copy
~ of this software and associated documentation files (the "Software"), to deal
~ in the Software without restriction, including without limitation the rights
~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
~ copies of the Software, and to permit persons to whom the Software is
~ furnished to do so, subject to the following conditions:
~
~ The above copyright notice and this permission notice shall be included in all
~ copies or substantial portions of the Software.
~
~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
~ SOFTWARE.
-->

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
android:id="@+id/main_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#aaaaaa"
android:clipToPadding="true"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:requiresFadingEdge="none"
android:scrollbars="vertical" />
</android.support.v4.widget.NestedScrollView>
</android.support.v4.widget.SwipeRefreshLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:id="@+id/first"
style="@style/IndicateText"/>

<TextView
android:id="@+id/last"
style="@style/IndicateText"/>

<TextView
android:id="@+id/count"
style="@style/IndicateText"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#33000000">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Jump Position"/>

<EditText
android:id="@+id/position"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:numeric="integer"/>

<Button
android:id="@+id/jump"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Jump"/>

<TextView
android:id="@+id/total_offset"
style="@style/IndicateText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:paddingLeft="20dp"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -158,12 +158,21 @@ public void setPerformanceMonitor(PerformanceMonitor performanceMonitor) {
}

public void setNoScrolling(boolean noScrolling) {
setAutoMeasureEnabled(!noScrolling);
this.mNoScrolling = noScrolling;
mSpaceMeasured = false;
mMeasuredFullSpace = 0;
mSpaceMeasuring = false;
}

@Override
public boolean isAutoMeasureEnabled() {
if (mNoScrolling) {
return false;
}
return super.isAutoMeasureEnabled();
}

public void setCanScrollVertically(boolean canScrollVertically) {
this.mCanScrollVertically = canScrollVertically;
}
Expand Down Expand Up @@ -1588,7 +1597,7 @@ public LayoutHelper findLayoutHelperByPosition(int position) {


// when set no scrolling, the max size should have limit
private static final int MAX_NO_SCROLLING_SIZE = Integer.MAX_VALUE >> 4;
private static final int MAX_NO_SCROLLING_SIZE = View.MEASURED_SIZE_MASK >> 2;

private boolean mSpaceMeasured = false;

Expand Down Expand Up @@ -1647,9 +1656,9 @@ public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,


if (getOrientation() == VERTICAL) {
super.onMeasure(recycler, state, widthSpec, View.MeasureSpec.makeMeasureSpec(measuredSize, View.MeasureSpec.AT_MOST));
super.onMeasure(recycler, state, widthSpec, View.MeasureSpec.makeMeasureSpec(measuredSize, View.MeasureSpec.EXACTLY));
} else {
super.onMeasure(recycler, state, View.MeasureSpec.makeMeasureSpec(measuredSize, View.MeasureSpec.AT_MOST), heightSpec);
super.onMeasure(recycler, state, View.MeasureSpec.makeMeasureSpec(measuredSize, View.MeasureSpec.EXACTLY), heightSpec);
}
}
}