RecyclerView同时为所有项目调用onCreateViewHolder和onBindViewHolder

时间:2016-10-23 17:51:18

标签: android performance android-recyclerview nestedscrollview

我有一个recyclerView能够在屏幕上显示最多3个项目,但是它会同时调用onCreateViewHolder和onBindViewHolder以获取列表中的所有45个项目(如下面的日志所示)。

只有在我将这些项目滚动到屏幕时才应该调用这些方法吗?

*我使用0和1的列表作为测试来定义它应该使用的布局。

我的适配器代码

public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

int[] post_list;
private static final int TYPE_0 =0;
private static final int TYPE_1=1;
private LayoutInflater inflater;
private Context context;
Activity mActivity;

public MyRecyclerAdapter(Context context, int[] list, Activity mActivity){
    this.context=context;
    inflater=LayoutInflater.from(context);
    this.list=list;
    this.mActivity = mActivity;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.e("onCreateViewHolder", "CALLED");
    if(viewType== TYPE_0){
        View view=inflater.inflate(R.layout.layout_type0, parent,false);
        Type0Holder holder=new Type0Holder(view);
        return holder;
    }
    else{
        View view=inflater.inflate(R.layout.layout_type1, parent,false);
        Type1Holder holder=new Type1Holder (view);
        return holder;
    }


}

@Override
public int getItemViewType(int position) {
    if(list[position]==0) {
        return TYPE_0;
    }
    else {
        return TYPE_1;
    }
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if(holder instanceof Type0Holder){
        Type0Holder type0Holder = (Type0Holder) holder;
        type0Holder .mTextView.setText("Layout type 0");
        Glide.with(mActivity.getApplicationContext()).load(R.drawable.imageTest).into(type0Holder.mImageView);
    }
    else{
        Type1Holder type1Holder = (Type1Holder ) holder;
        type1Holder .mTextView.setText("Layout type 1");
        Glide.with(mActivity.getApplicationContext()).load(R.drawable.imageTest).into(type1Holder.mImageView);
    }
    Log.e("onBindViewHolder", String.valueOf(position));

}

@Override
public int getItemCount() {
    return post_list.length;
}

class Type0Holder extends RecyclerView.ViewHolder {
    TextView mTextView;
    ImageView mImageView;

    public Type0Holder (View view) {
        super(view);
        mTextView= (TextView) itemView.findViewById(R.id.text_view0);
        mImageView= (ImageView) itemView.findViewById(R.id.image_view0);

    }
}

class Type1Holder extends RecyclerView.ViewHolder {
    TextView mTextView;
    ImageView mImageView;

    public ImagePostHolder(View itemView) {
        super(itemView);
        mTextView= (TextView) itemView.findViewById(R.id.text_view1);
        mImageView= (ImageView) itemView.findViewById(R.id.image_view1);
    }
}

我的Recycler xml

  <android.support.v4.widget.NestedScrollView
    android:id="@+id/nested_scroll_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:fillViewport="true"
    android:paddingBottom="3dp"
    >


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:orientation="vertical"
        android:clipToPadding="false">


        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            ></android.support.v7.widget.RecyclerView>


    </RelativeLayout>



</android.support.v4.widget.NestedScrollView>

我的LOG显示它一次调用所有项目,甚至是那些不可见的项目。

10-23 15:15:46.093 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.113 28766-28766/com.example..E/HOLDER: 0
10-23 15:15:46.113 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.113 28766-28766/com.example..E/HOLDER: 1
10-23 15:15:46.113 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.123 28766-28766/com.example..E/HOLDER: 2
10-23 15:15:46.123 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.123 28766-28766/com.example..E/HOLDER: 3
10-23 15:15:46.123 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.133 28766-28766/com.example..E/HOLDER: 4
10-23 15:15:46.133 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.133 28766-28766/com.example..E/HOLDER: 5
10-23 15:15:46.143 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.143 28766-28766/com.example..E/HOLDER: 6
10-23 15:15:46.143 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.143 28766-28766/com.example..E/HOLDER: 7
10-23 15:15:46.153 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.153 28766-28766/com.example..E/HOLDER: 8
10-23 15:15:46.153 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.153 28766-28766/com.example..E/HOLDER: 9
10-23 15:15:46.163 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.163 28766-28766/com.example..E/HOLDER: 10
10-23 15:15:46.163 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.163 28766-28766/com.example..E/HOLDER: 11
10-23 15:15:46.173 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.173 28766-28766/com.example..E/HOLDER: 12
10-23 15:15:46.173 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.183 28766-28766/com.example..E/HOLDER: 13
10-23 15:15:46.183 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.183 28766-28766/com.example..E/HOLDER: 14
10-23 15:15:46.183 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.183 28766-28766/com.example..E/HOLDER: 15
10-23 15:15:46.193 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.193 28766-28766/com.example..E/HOLDER: 16
10-23 15:15:46.193 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.193 28766-28766/com.example..E/HOLDER: 17
    10-23 15:15:46.203 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.203 28766-28766/com.example..E/HOLDER: 18
10-23 15:15:46.203 28766-28766/com.example..E/CREATE HOLDER: CALLED
10-23 15:15:46.213 28766-28766/com.example.. E/HOLDER: 19
    10-23 15:15:46.213 28766-28766/com.example.. E/CREATE HOLDER: CALLED
    10-23 15:15:46.213 28766-28766/com.example.. E/HOLDER: 20
    10-23 15:15:46.213 28766-28766/com.example.. E/CREATE HOLDER: CALLED
    10-23 15:15:46.213 28766-28766/com.example.. E/HOLDER: 21
10-23 15:15:46.223 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.223 28766-28766/com.example.. E/HOLDER: 22
10-23 15:15:46.223 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.233 28766-28766/com.example.. E/HOLDER: 23
10-23 15:15:46.233 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.233 28766-28766/com.example.. E/HOLDER: 24
10-23 15:15:46.233 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.233 28766-28766/com.example.. E/HOLDER: 25
10-23 15:15:46.243 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.243 28766-28766/com.example.. E/HOLDER: 26
10-23 15:15:46.243 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.243 28766-28766/com.example.. E/HOLDER: 27
10-23 15:15:46.253 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.253 28766-28766/com.example.. E/HOLDER: 28
10-23 15:15:46.253 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.253 28766-28766/com.example.. E/HOLDER: 29
10-23 15:15:46.263 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.263 28766-28766/com.example.. E/HOLDER: 30
10-23 15:15:46.263 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.263 28766-28766/com.example.. E/HOLDER: 31
10-23 15:15:46.273 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.283 28766-28766/com.example.. E/HOLDER: 32
10-23 15:15:46.283 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.283 28766-28766/com.example.. E/HOLDER: 33
10-23 15:15:46.293 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.313 28766-28766/com.example.. E/HOLDER: 34
10-23 15:15:46.313 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.323 28766-28766/com.example.. E/HOLDER: 35
10-23 15:15:46.323 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.323 28766-28766/com.example.. E/HOLDER: 36
10-23 15:15:46.333 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.333 28766-28766/com.example.. E/HOLDER: 37
10-23 15:15:46.333 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.343 28766-28766/com.example.. E/HOLDER: 38
10-23 15:15:46.343 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.343 28766-28766/com.example.. E/HOLDER: 39
10-23 15:15:46.343 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.353 28766-28766/com.example.. E/HOLDER: 40
10-23 15:15:46.353 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.353 28766-28766/com.example.. E/HOLDER: 41
10-23 15:15:46.353 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.363 28766-28766/com.example.. E/HOLDER: 42
10-23 15:15:46.363 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.363 28766-28766/com.example.. E/HOLDER: 43
10-23 15:15:46.373 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.373 28766-28766/com.example.. E/HOLDER: 44
10-23 15:15:46.373 28766-28766/com.example.. E/CREATE HOLDER: CALLED
10-23 15:15:46.383 28766-28766/com.example.. E/HOLDER: 45

更新1 - 我发现我的recyclerView没有回收的原因是因为它在NestedScrowView中,所以我如何让它回收视图,即使它在NestedScrowView中?

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。在我的情况下,NestedScrollView是底部工作表的根,我将其替换为FrameLayout,并且它有效。

如果可以,您应该尝试使用FrameLayout

答案 1 :(得分:0)

当您将recyclerview的高度包装内容时,它将一次构建所有子视图,因为NestedScrollView中没有任何关于recyclerview的兄弟,您可以删除NestedScrollVeiw并进行如下布局:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" 
        />

解决方案2: 您可以将RecyclerView和RelativeLayout的高度设置为与父项匹配

答案 2 :(得分:-1)

在RecyclerView上禁用nestedScrolling:

mRecyclerView.setNestedScrollingEnabled(false);