Java Recyclerview 不调用 onCreateViewHolder

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27809524/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 05:05:04  来源:igfitidea点击:

Recyclerview not call onCreateViewHolder

javaandroidandroid-recyclerview

提问by Malinosqui

My RecyclerViewdoes not call onCreateViewHolder, onBindViewHoldereven MenuViewHolderconstructor, therefore nothing appears in RecyclerView. I put logs for debugging, and no log is shown. What might be the problem?

MyRecyclerView不会调用onCreateViewHolderonBindViewHolder甚至不会调用MenuViewHolder构造函数,因此RecyclerView. 我放了调试日志,没有显示日志。可能是什么问题?

My adapter:

我的适配器:

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

My custom row XML:

我的自定义行 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"/>

and my 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;
}

采纳答案by Konstantin Burov

Your getItemCountmethod returns 0. So RecyclerViewnever tries to instantiate a view. Make it return something greater than 0.

你的getItemCount方法returns 0。所以RecyclerView永远不要试图实例化一个视图。让它返回一些东西greater than 0

for example

例如

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

回答by kip2

For what it's worth, I observed it when I set the recycler view adapter beforethe adapter was actually initialized. Solution was to make sure recyclerView.setAdapter(adapter)was called with a non-null adapter

对于它的价值,我在适配器实际初始化之前设置回收器视图适配器时观察到它。解决方案是确保recyclerView.setAdapter(adapter)使用非空适配器调用

回答by Lay Leangsros

Another one is make sure you set layout manager to RecyclerView:

另一个是确保将布局管理器设置为 RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

回答by jian lang

Setting the height of the TextViewin the custom.xmlor RecyclerView. If height is wrap-content, the RecyclerViewwill not be visible.

TextViewcustom.xml或 中设置 的高度RecyclerView。如果 height 为wrap-content,则RecyclerView将不可见。

回答by J Wang

This happened when my RecyclerViewwas inside a ScrollViewand I was using Android Support Library 23.0. To fix, I updated to Android Support Library 23.2:

当我RecyclerView在 a 中ScrollView并且使用 Android Support Library 23.0.0时发生了这种情况。为了修复,我更新到了 Android 支持库 23.2:

In build.gradle:

在 build.gradle 中:

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

回答by venky

This does not apply for your particular case. But this might help someone else.

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

This reason could be careless usage of the following method

这个原因可能是不小心使用了以下方法

recyclerView.setHasFixedSize(true);

If not used with caution, this might cause the onBindViewand onCreateViewHolderto not be called at all, with no error in the logs.

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

回答by Mandeep Yadav

Please set layout manager to RecyclerViewlike below code:

请将布局管理器设置为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));

回答by Mateusz Wlodarczyk

In my case I set the ID of my RecyclerView to "recyclerView". It seems that this ID was already defined somewhere, because when I changed that to different ID, the methods from the adapter were called properly.

就我而言,我将 RecyclerView 的 ID 设置为“recyclerView”。似乎这个 ID 已经在某处定义了,因为当我将它更改为不同的 ID 时,来自适配器的方法被正确调用。

回答by David Hackro

Other option is if you send this list objetc using get,verify if you have correct reference,for example

其他选项是,如果您使用 get 发送此列表 objetc,请验证您是否有正确的参考,例如

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}

回答by Dooie

If using a custom adapter do not forget to set the ItemCount to the size of your collection.

如果使用自定义适配器,请不要忘记将 ItemCount 设置为您的集合的大小。