简体   繁体   English

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

[英]RecyclerView calling onCreateViewHolder and onBindViewHolder for all items at once

I have a recyclerView capable of showing the maximum of 3 items on screen, but it calls onCreateViewHolder and onBindViewHolder for all 45 items in the list, all at once (as in the LOG below).我有一个 recyclerView 能够在屏幕上显示最多 3 个项目,但它同时为列表中的所有 45 个项目调用 onCreateViewHolder 和 onBindViewHolder(如下面的 LOG 所示)。

Shouldn't it be calling those methods only as I scroll those items to the screen?它不应该只在我将这些项目滚动到屏幕时调用这些方法吗?

*I am using a list with 0's and 1's as a test to define which layout it should use. *我使用一个包含 0 和 1 的列表作为测试来定义它应该使用的布局。

My Adapter Code我的适配器代码

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);
    }
}

My Recycler xml我的回收站 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>

My LOG showing it is calling all items at once, even the ones that are not visible.我的 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

UPDATE 1 - I found out that the reason my recyclerView is not recycling is because it is inside a NestedScrowView, so how do I make it recycle the view even if its inside the NestedScrowView?更新 1 - 我发现我的 recyclerView 没有回收的原因是因为它在 NestedScrowView 中,那么即使它在 NestedScrowView 中,我如何让它回收视图?

I had the same problem.我有同样的问题。 In my case NestedScrollView is the root for Bottom Sheet and I replaced it with a FrameLayout , and it worked.在我的情况下, NestedScrollView是 Bottom Sheet 的根,我用FrameLayout替换了它,并且它起作用了。

If you can, you should try using a FrameLayout如果可以,您应该尝试使用FrameLayout

when you make the height of the recyclerview to wrap-content it build all childview once, since you don't have any sibling for the recyclerview inside NestedScrollView you can remove the NestedScrollVeiw and make the layout like this:当您将 recyclerview 的高度设置为 wrap-content 时,它会一次构建所有 childview,因为您在 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" 
        />

Solution #2: you can make the height of your RecyclerView and RelativeLayout to match-parent解决方案#2:您可以将 RecyclerView 和 RelativeLayout 的高度设置为 match-parent

在 RecyclerView 上禁用nestedScrolling:

mRecyclerView.setNestedScrollingEnabled(false);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RecyclerView 适配器`onCreateViewHolder` &amp; `onBindViewHolder` 只调用一次 - RecyclerView adapter `onCreateViewHolder` & `onBindViewHolder` invoked only once RecyclerVIew onCreateViewHolder 和 onBindViewHolder 没有被调用 - RecyclerVIew onCreateViewHolder and onBindViewHolder is not called 子recyclerview方法未调用(onCreateViewHolder,onBindViewHolder)。 但是getItemCount()方法正在调用 - child recyclerview methods is not calling (onCreateViewHolder, onBindViewHolder). But getItemCount() method is calling RecyclerView在onCreateViewHolder而非onBindViewHolder处设置onclick事件 - RecyclerView setting onclick event at onCreateViewHolder, not onBindViewHolder 支持库和RecyclerView onBindViewHolder和onCreateViewHolder的Proguard问题 - Proguard issue with Support Library and RecyclerView onBindViewHolder and onCreateViewHolder onCreateViewHolder没有在fragmnet recyclerview中调用 - onCreateViewHolder not calling in fragmnet recyclerview RecyclerView onCreateViewHolder 方法未调用 - RecyclerView onCreateViewHolder method not calling RecyclerView 不调用 onCreateViewHolder 或 onBindView - RecyclerView not calling onCreateViewHolder or onBindView RecyclerView中没有调用适配器的onCreateViewHolder和onBindViewHolder方法? - Adapter onCreateViewHolder and onBindViewHolder methods are not getting called in RecyclerView? Recyclerview 不调用任何适配器方法 :onCreateViewHolder,onBindViewHolder, - Recyclerview not call any Adapter method :onCreateViewHolder,onBindViewHolder,
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM