Recyclerview没有调用onCreateViewHolder方法

210

我的 RecyclerView 没有调用 onCreateViewHolder, onBindViewHolder 甚至 MenuViewHolder 构造函数,因此在 RecyclerView 中没有显示任何内容。

我为了调试而放置了日志,但没有出现任何日志。

可能的问题是什么?

我的适配器:

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
private LayoutInflater inflater;
List<Menu> data = Collections.emptyList();

public MenuAdapter(Context context, List<Menu> data) {
    Log.i("DEBUG", "Constructor");
    inflater = LayoutInflater.from(context);
    Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toString());
    this.data = data;
    for(Menu menu: this.data){
        Log.i("DEBUG MENU - CONSTRUCTOR", menu.menu);
    }
}

@Override
public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.row_menu, parent, false);
    MenuViewHolder holder = new MenuViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
    Log.i("DEBUG MENU", "onBindViewHolder");
    Menu current = data.get(position);
    holder.title.setText(current.menu);
}

@Override
public int getItemCount() {
    return 0;
}

class MenuViewHolder extends RecyclerView.ViewHolder {
    TextView title;
    ImageView icon;

    public MenuViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.menuText);
    }
}

我的自定义行XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/menuText"
    android:text="Dummy Text"
    android:layout_gravity="center_vertical"
    android:textColor="#222"/>

以及我的Fragment:

public NavigationFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
    if (savedInstanceState != null) {
        mFromSavedInstaceState = true;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_navigation, container, false);
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.drawer_list);
    MenuAdapter adapter = new MenuAdapter(getActivity(), getData());
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setAdapter(adapter);
    return view;
}

为什么你设置了两次recyclerView.setAdapter(adapter)? - Panayiotis Irakleous
转到你的XML文件。将布局更改为wrap content。一个元素隐藏了下一个元素,所以方法无法正常工作! - Koala
这个问题的另一个原因是错误地使项目布局与父元素的高度匹配,因此一次只显示一个项目。 - Joe Lapp
在我的代码中,这句话很有帮助:invoicesRecyclerView.setHasFixedSize(true) invoicesRecyclerView.setLayoutManager(GridLayoutManager(this, 1)) - Alexei
37个回答

540

另一个要注意的是,确保你将布局管理器设置为RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

12
这甚至在任何教程中都没有提到,人们怎么可能知道呢?几乎每个安卓模式都是如此。 - pete
11
另一种指定布局管理器的方法可以是像这样的xml属性:app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" - XZen
3
这个问题花费我的时间比我愿意承认的要长。 - Matthew Mitchell
你让我开心到爆啦!!! - Shahen Kosyan

291

你的 getItemCount 方法 返回 0。所以 RecyclerView 永远不会尝试实例化视图。请让它返回一些 大于 0 的值。

例如

@Override
public int getItemCount() {
    return data.size();
}

30
哦天啊,我现在感觉太蠢了! :facepalm: 谢谢你! - Shinta S
4
我刚刚因为getItemCount()方法在代码中的位置太靠下而将近浪费了一个小时,我没有注意到它。 :| - Joel
我有一个自定义适配器,但忘记将我的itemcount设置为我的集合大小。 - Dooie
7
我的项目数量是3,但仍然不可见。在onBind或onCreateHolder中没有调试点……但在getItemCount中有调试点。 - Cyph3rCod3r
哦,天啊!我也在为这个问题苦苦挣扎,想弄清楚为什么我的断点没有被触发,现在我知道了...哈哈!该死!!!谢谢! - Vincy
显示剩余3条评论

46

我在添加之后忘记加下面这行,加上后它对我有用了。

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

20
这个答案与@Lay Leangsros_上面的那个答案有何不同? - Mehdi Dehghani
当谷歌从一开始就没有告诉任何人需要它时,不要称之为“遗忘”。 - Jack M

27

我真的真的希望这能对某人有所帮助,我刚刚花了一个多小时疯狂地进行处理!

我曾经有过这样的经历:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

当我本应该拥有这个时:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

由于我愚蠢地将我的适配器命名为adapter,在应用程序块中被回收视图的适配器所遮盖! 我将适配器重命名为projectAdapter以区分它,问题得到解决!


2
就是这样。我希望Kotlin/AndroidStudio能够以不同的方式突出显示变量是来自此块还是其他地方。 - rndstr
或者 this.adapter = this@YourFragment.adapter(或 YourActivity)。 - CoolMind
我希望我能用一些BAT或其他东西来给你打赏。 - Nissi

20

请按照以下代码示例,为RecyclerView设置布局管理器:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

19

这并不适用于您的特定情况。但这可能会对其他人有所帮助。

这个原因可能是以下方法的疏忽使用。

recyclerView.setHasFixedSize(true);

如果不小心使用,这可能会导致onBindViewonCreateViewHolder根本不被调用,并且日志中没有错误记录。


11

也许能帮到某些人,但是如果你将 RecycleView 的可见性设置为 GONE,适配器方法根本就不会被调用... 我花了一些时间才弄清楚这个问题。


1
用了1-3个小时,天啊T_T绝望了,已经筋疲力尽lmaooo。 - Akbar Noto

10

说实话,当我在适配器实际初始化之前设置回收视图适配器时,我注意到了这一点。解决方案是确保使用非空适配器调用recyclerView.setAdapter(adapter)


6

custom.xml 或者 RecyclerView 中设置 TextView 的高度。如果高度为 wrap-contentRecyclerView 将不可见。


花了很多时间在这上面...回收视图的高度为零。当在活动中使用时,它会自动扩展。但是在其他布局内的片段中,它没有扩展。 - Asif Shiraz

4

当我的RecyclerView位于ScrollView内,并且我正在使用Android Support Library 23.0时,出现了这种情况。为了修复此问题,我更新到了Android Support Library 23.2:

在build.gradle中:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接