当前位置: 首页 > 知识库问答 >
问题:

RecyclerView不调用onCreateViewHolder或onBindView

田化
2023-03-14

没有任何错误,所有数据似乎都有效。出于某种原因,正在调用与视图相关的其他方法。我已经确保了以下几点:

>

>

  • 正在调用构造函数,成员变量有效。

    父视图是垂直线性布局;没有scrollview,或任何其他具有自己滚动属性的视图。

    包含片段的视图被创建并显示在屏幕上。

    下面是片段中的声明,后跟适配器。任何帮助都将不胜感激,因为这完全令人困惑。

    SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);
    
    public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
    private static final String TAG = String.format("==> %S", SubMenuAdapter.class.getSimpleName());
    
    private final List<ContentItem> mContentItems;
    private Context mContext;
    
    public SubMenuAdapter(Context context, List<ContentItem> contenItems) {
        Log.d(TAG, "Constructor called");
        mContentItems = contenItems;
        mContext = context;
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.d(TAG, "onCreateViewHolder called");
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_resource_efficiency, parent, false);
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Log.d(TAG, "onBindViewHolder called");
    
        ContentItem item = mContentItems.get(position);
        holder.textName.setText(item.getName());
        FontSetter.setMyriadProRegular(mContext, holder.textName);
        Picasso.with(mContext).load("file://" + item.getPreviewImageDefault()).into(holder.imageIcon);
    }
    
    @Override
    public int getItemCount() {
        Log.d(mContext, String.format("getItemCount: %d", mContentItems.size()));
        return mContentItems.size();
    }
    
    // ViewHolder
    public static class ViewHolder extends RecyclerView.ViewHolder {
    
        TextView textName;
        ImageView imageIcon;
    
        public ViewHolder(View view) {
            super(view);
            textName = (TextView) view.findViewById(R.id.tv_resource_efficiency_option);
            imageIcon = (ImageView) view.findViewById(R.id.iv_resource_efficiency_icon);
        }
    }
    
  • 共有3个答案

    鲁德佑
    2023-03-14

    确保回收视图不是nestedscrollview的子视图

    例如,此代码将不起作用。

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/responder_scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/darkGray"
        android:clipToPadding="false"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="24dp"
                app:cardElevation="@dimen/spacing_medium"
                app:cardUseCompatPadding="true">
    
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
    
                    <TextView
                        android:id="@+id/responder_testimonial"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentTop="true"
                        android:text="Testimonial"
                        android:textSize="@dimen/general_font_size" />
    
                    <TextView
                        android:id="@+id/responder_counter_testimonial"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_toRightOf="@+id/responder_testimonial"
                        android:text="170"
                        android:textSize="@dimen/general_font_size_small" />
    
                    <Button
                        android:id="@+id/responder_btn_testimonial"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:layout_alignParentTop="true"
                        android:text="Go" />
    
                   <view
                        android:id="@+id/responder_list_testimonial"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_below="@+id/responder_testimonial"
                        class="android.support.v7.widget.RecyclerView"/>
                </RelativeLayout>
            </android.support.v7.widget.CardView>
    
        </FrameLayout>
    </android.support.v4.widget.NestedScrollView>
    

    然后我用,

    <android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    
    <view
        android:id="@+id/responder_list_testimonial"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/responder_testimonial"
        class="android.support.v7.widget.RecyclerView"/>
    
    苏淇
    2023-03-14

    我已经找了一个多小时的答案了。

    在设置适配器之前,别忘了调用这一行。

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    

    似乎回收器视图没有内置默认布局管理器选项,所以我们必须通过编程添加它。

    如果你觉得有用,干杯。

    解修然
    2023-03-14

    这也可能帮助某人

    首次使用

    recyclerView.setAdapter(adapter);
    

    然后是:

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    

    所以看起来是这样的:

    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    

    顺序颠倒了

    更新:

    现在我只是简单地使用:

    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    

    在xml中的RecyclView

     类似资料:
    • 问题内容: 我的RecyclerView不会调用onCreateViewHolder,onBindViewHolder,因此,在recyclerview中不会显示任何内容。我放置了调试日志,但未显示日志。可以是什么? 我的适配器: 我将用于在RecyclerView中添加项目。 在片段中: XML档案: comment_row xml文件: 我将使用以下代码将项目添加到RecyclerView:

    • 我想单击按钮将添加到中,但未调用适配器的实现方法。 这是我的代码: CourseDetailAdapter。班 我想为输入数据添加layout,所以我不确定是否正确

    • 当我的设备联机时,RecyclerView适配器会按预期工作。脱机时,不会调用onCreateViewHolder。 首先,我知道这一点:Recyclerview不会调用CreateViewHolder,这不是问题所在。getItemCount()返回一个数字 所以,它似乎与在线/离线状态有关,但我无法弄清楚如何。这是适配器:

    • 我已经研究了这个问题的几个SO答案(这里、这里和这里),但没有一个提议的解决方案奏效。我的问题是我的RecyclView列表项没有显示。我在MessengerRecyclAdapter、onCreateViewHolder、onBindViewHolder和getItemCount中设置了断点,并且只调用了第一个。在断点中,我输入了表达式评估器并执行 并得到了预期的答案20。RecyclerVie

    • 我的不调用、甚至构造函数,因此中不显示任何内容。我放了日志进行调试,但没有显示日志。可能是什么问题? 我的适配器: 我的自定义行XML: 而我的片段:

    • 对于在DrawerLayout中使用RecolyerView还是ListView我有点困惑。 我读了一篇教程,其中解释了如何使用RecolyerView创建NavigationDrawer。 根据Google的说法:RecolyerView是 1)用于显示大型数据集的容器,通过维护有限数量的视图可以非常高效地滚动这些数据集。 2)在内部使用了一个布局管理器。布局管理器将项视图放置在Recycler