Java RecyclerView未调用onCreateViewHolder或onBindView

Java RecyclerView未调用onCreateViewHolder或onBindView,java,android,android-fragments,android-recyclerview,Java,Android,Android Fragments,Android Recyclerview,没有得到任何错误,所有数据似乎都有效。出于某种原因,正在调用与视图相关的其他方法。我已确保以下几点: getItemCount()是唯一被调用的适配器方法,它返回一个正整数值(我知道这将是你们将看到的区域) 正在调用构造函数,成员变量有效 父视图是垂直线性布局;看不到scrollview或任何其他具有自己滚动属性的视图 创建包含片段的视图并显示在屏幕上 下面是片段中的声明,后跟适配器。任何帮助都将不胜感激,因为这完全是莫名其妙的 SubMenuAdapter adapter = new

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

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

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

    • 父视图是垂直线性布局;看不到scrollview或任何其他具有自己滚动属性的视图

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

下面是片段中的声明,后跟适配器。任何帮助都将不胜感激,因为这完全是莫名其妙的

SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
公共类子菜单适配器扩展了RecyclerView.Adapter{
私有静态最终字符串标记=String.format(“==>%S”,submenualAdapter.class.getSimpleName());
私人最终清单mContentItems;
私有上下文;
公共子菜单适配器(上下文、列表上下文){
Log.d(标记“调用的构造函数”);
mContentItems=上下文项;
mContext=上下文;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
d(标记为“onCreateViewHolder”);
视图=LayoutFlater.from(parent.getContext()).flate(R.layout.row\u resource\u efficiency,parent,false);
返回新的ViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
Log.d(标记“onBindViewHolder called”);
ContentItem=mContentItems.get(位置);
holder.textName.setText(item.getName());
setMyriadProRegular(mContext,holder.textName);
Picasso.with(mContext).load(“文件:/”+item.getPreviewImageDefault()).into(holder.imageIcon);
}
@凌驾
public int getItemCount(){
Log.d(mContext,String.format(“getItemCount:%d”,mContentItems.size());
返回mContentItems.size();
}
//观众
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图文本名称;
图像视图图像图标;
公共视图持有者(视图){
超级(视图);
textName=(TextView)view.findViewById(R.id.tv\u资源\u效率\u选项);
imageIcon=(ImageView)view.findViewById(R.id.iv\u资源\u效率\u图标);
}
}

确保回收视图不是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布局中,actionbar采用了
match\u parent
,而替换片段的
FrameLayout
,没有显示任何可用的位置。这就是为什么没有调用方法的原因


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

这也可能对某些人有所帮助

首次使用

recyclerView.setAdapter(adapter);
然后:

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
所以它看起来是这样的:

recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
顺序颠倒了

更新:

现在我只使用:

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

在xml中的
RecyclerView
上,我遇到了同样的问题,即未调用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.setHasFixedSize(true);

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

在我的例子中,我将我的RecyclerView的ID设置为“RecyclerView”。似乎这个ID已经在某处定义了,因为当我将其更改为不同的ID时,适配器中的方法被正确调用


我也面临着同样的问题,即
onCreateViewHolder
onBindView
方法没有被调用,只有
getItemCount
被调用。因此,基本上是
RecyclerView
的高度和重量的问题,在更改后设置为
wrap\u content
0dp
它在某种程度上解决了这个问题。

我知道这个话题很老,但如果你犯了和我一样的学习者错误,你可能会发现这很有帮助

当我在某个网站上学习RecyclerView、复制一些代码并适应我的环境时,我创建了不同的变量(例如用户和数据)这意味着要做同样的事情,除了一些方法调用数据,一些方法调用用户。这是一个很容易犯的错误,因为你试图理解别人的代码和java功能(这在我身上经常发生)

很高兴知道,您可以在控制台中java代码的任何位置打印LN,这样就可以很容易地进行调试


祝你好运!

我最近遇到了这个问题,显然有很多可能的原因。请尝试这些选项中的一个或多个,看看哪一个对你有效:)

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

// 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和
<?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>
recyclerView.setLayoutManager(new LinearLayoutManager(this));
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
@Override
    protected void onStart() {
        super.onStart();
        Log.d("OnStart","Calling OnStart.");
        FirebaseRecyclerOptions<Data> options = new FirebaseRecyclerOptions.Builder<Data>().setQuery(mDatabase, new SnapshotParser<Data>() {
            @NonNull
            @Override
            public Data parseSnapshot(@NonNull DataSnapshot snapshot) {
                Log.d("parseSnapshot",snapshot.child("name").getValue().toString());
                return new Data(snapshot.child("name").getValue().toString(),
                        snapshot.child("description").getValue().toString(),
                        snapshot.child("id").getValue().toString(),
                        snapshot.child("date").getValue().toString());
            }
        }).build();
        FirebaseRecyclerAdapter<Data,MyViewHolder> adapter = new FirebaseRecyclerAdapter<Data, MyViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i, @NonNull Data data) {
                Log.d("OnBindViewHolder",data.getName());
                myViewHolder.setName(data.getName());
                myViewHolder.setDescription(data.getDescription());
                myViewHolder.setDate(data.getDate());
            }

            @NonNull
            @Override
            public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                Log.d("OnCreateViewHolder","Creating the viewHolder");
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itemlayout,parent,false);
                return new MyViewHolder(view);
            }
        };
        recyclerView.setAdapter(adapter);
        Log.d("OnStart","Exiting OnStart.");
    }