RecyclerView不调用onCreateViewHolder或onBindView

没有得到任何错误,所有的数据似乎有效。 出于某种原因,视图相关的方法被称为。 我已经确定了以下内容:

  • getItemCount()是唯一被调用的适配器方法,并返回一个正整数值(我知道这将是你们将要看的区域)

    • 正在调用构造函数,成员variables是有效的。

    • 父视图是一个垂直的LinearLayout; 没有滚动视图,或任何其他视图与他们自己的滚动属性在眼前。

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

这里是片段后面跟着适配器的声明。 任何帮助将不胜感激,因为这已经完全困惑。

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

这也可能有助于某人

首次使用

 recyclerView.setAdapter(adapter); 

接着:

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

所以它会看起来像这样:

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

顺序是颠倒的

确保你从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"/> 

我不知道这是否对任何人有帮助,但我几乎有同样的问题。 我的问题不在片段/类和回收站适配器中。 问题出现在父级XML布局中,其中操作FrameLayout采取了match_parent ,其中的FrameLayout – 片段被replace – 没有得到任何可用的地方显示。 这就是为什么这些方法没有被调用。

对于面临同样问题的人来说,我想也可能是类似的情况。 仔细检查每个XML文件中的每个宽度和高度可能在同一个树中,因为问题似乎根本不在适配器中。

我的两个便士在这里。 只花了三个多小时来debugging这个。

确保你没有不小心使用下面的行。

recyclerView.setHasFixedSize(true);

只有当您确定视图的大小不变时才设置固定大小。 如果不是,onCreateViewHolder和onBindView方法可能根本不会被调用。

我知道这个话题很老,但是如果你像我一样做了同样的学习者错误,你可能会觉得这很有帮助。

当我在一些关于RecyclerView的网站上学习,复制一些代码并适应我的上下文时,我创build了不同的variables(例如用户和数据),这些variables意图做同样的事情,除了一些方法是调用数据,有些调用用户。 当你试图理解别人的代码和Javafunction时(这一直发生在我身上),这是一个很容易犯的错误。

很高兴知道您可以在您的Java代码中的任意位置打印控制台,因此您可以非常轻松地进行debugging。

祝你好运!

我有同样的问题没有onCreateViewHolder或onBindViewHolder被调用。 改变你的onCreateViewHolder方法来使用你在构造函数中保存了一个引用的上下文,而不是使用parent.getContext()应该修复它:

 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.d(TAG, "onCreateViewHolder called"); View view = LayoutInflater.from(mContext).inflate(R.layout.row_resource_efficiency, parent, false); return new ViewHolder(view); 

在我的情况下,我把我的RecyclerView的ID设置为“recyclerView”。 看起来这个ID已经在某个地方定义了,因为当我把它改成不同的ID时,适配器的方法被正确调用了。

链接到答案

我也面临同样的问题, onCreateViewHolderonBindView方法没有得到调用,只有getItemCount被调用。 所以这基本上是问题与RecyclerView的高度和重量设置为wrap_content0dp 。 将其更改为某个值后,解决了问题。

我最近遇到这个问题,显然有很多可能的原因。 尝试一个或这些选项的组合,看看哪一个(S)为你工作:)

1.布局pipe理器
确保您将布局pipe理器设置为您的回收站视图,如下所示

 // create a layout manager LinearLayoutManager linearLayoutManager = new LinearLayoutManager(my_context); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); // get recycler view RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id); // set recyclerView.setLayoutManager(linearLayoutManager); 

2.固定大小
确保您说明您的回收商视图是否具有固定大小

 // set fixed size recyclerView.setHasFixedSize(true); // or false depending on implementation 

3. XML
确保您的回收站不会嵌套太多的布局,例如ScrollView和RelativeLayout的组合。 简单一点,看看它是否解决了你的问题

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/thread_list" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>