Recyclerview 不调用 onCreateViewHolder

Recyclerview not call onCreateViewHolder

我的 RecyclerView 不调用 onCreateViewHolderonBindViewHolder 甚至 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"/>

和我的片段:

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

你的 getItemCount 方法 returns 0。所以 RecyclerView 从不尝试实例化视图。让它 return 变成 greater than 0.

例如

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

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

调用 recyclerView.setAdapter(adapter)

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

recycler.setLayoutManager(new LinearLayoutManager(this));

custom.xmlRecyclerView中设置TextView的高度。如果高度为 wrap-content,则 RecyclerView 将不可见。

当我的 RecyclerViewScrollView 中并且我正在使用 Android 支持库 23.0 时,就会发生这种情况。为了修复,我更新到 Android 支持库 23.2:

在build.gradle中:

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

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

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

recyclerView.setHasFixedSize(true);

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

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

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

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

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

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

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

我遇到了同样的问题,因为我在布局资源中使用了 android.support.constraint.ConstraintLayout。 更改为 FrameLayout 有帮助。

在我的例子中,我的列表大小是 0,它没有调用 onCreateViewHolder 方法。我需要在空列表的中心显示一条消息作为占位符,所以我这样做了并且效果很好。 @Konstantin Burov 的回答很有帮助。

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}

我为这个问题苦苦挣扎了好几个小时。我正在使用一个片段。问题是没有返回 view。下面是我的代码:

ProductGridBinding binding = DataBindingUtil.inflate( inflater, R.layout.product_grid, container, false);



    mLinearLayoutManager = new LinearLayoutManager(getActivity());
    mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    binding.rvNumbers.setHasFixedSize(true);
    binding.rvNumbers.setLayoutManager(mLinearLayoutManager);
    binding.rvNumbers.setAdapter(adapter);


    View view = binding.getRoot();


    return view;

请做以下事情

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

将此添加到您的适配器Class

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

我在添加对我有用后忘记添加下面的行

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

我遇到的是 RecyclerView.adaptor 的 onBindViewHolder( holder , position) 覆盖方法未被调用。调用了 onCreateViewHolder 方法,调用了 getItemCount。如果你阅读了 Recyclerview Adapter 的规范,你会了解到如果你重写了 onBindViewHolder( holder, position, List payloads) 将被调用以支持。所以请小心。

如果您正在使用 android 数据绑定库,请参阅我的回答 - 确保您正在为 recyclerview 设置布局并且项目数必须大于 0

 @BindingAdapter({"entries", "layout"})
    public static void setEntries(RecyclerView view, ArrayList<LoginResponse.User> listOfUsers, int layoutId) {
        if (view.getAdapter() == null) {
            view.setLayoutManager(new LinearLayoutManager(view.getContext()));
            SingleLayoutAdapter adapter = new SingleLayoutAdapter(layoutId) {
                @Override
                protected Object getObjForPosition(int position) {

                    return listOfUsers.get(position);
                }

                @Override
                public int getItemCount() {
                    return listOfUsers.size();
                }
            };
            view.setAdapter(adapter);
        }
    }

编码愉快:-)

如果您将 wrap_content 作为列表的高度以及项目列表的高度,则不会显示任何内容,并且会调用 none 的 recyclerView 函数。固定项目的高度或将 match_parent 作为列表高度。那解决了我的问题。

在我的例子中,在将 Activity 更改为使用 ViewModel 和 DataBinding 后,我忘记删除从 onCreate 方法调用的 setContentView 方法。删除它我的问题就解决了。

我的错误是在 Fragment onCreateView 中夸大了错误的视图。

也许它对某人有帮助,但如果您将 RecycleView 的可见性设置为 GONE,则根本不会调用适配器方法...我花了一些时间才弄明白。

对我来说,这是因为 setHasStableIds(真); 方法已设置。 删除它,它将起作用

我真的真的希望有一天这对某人有所帮助。我只花了一个多小时就搞砸了!

我有这个:

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

我什么时候应该有这个:

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

因为我愚蠢地调用了我的适配器 adapter,它在应用块中被回收器视图的适配器隐藏了!我将适配器重命名为 projectAdapter 以区分它并解决问题![​​=13=]

recyclerView.setAdapter(适配器);称为 通过调用方法填充 recyclerView 列表。

确保您的 XMLKoltin/Java 代码匹配。就我而言,自从我写了 ViewHolder 之后我就遇到了问题:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

但是因为我的 XML 代码是:

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

我不得不将上一行更改为:

var txt: TextView = itemView.findViewById(R.id.txt)

此外,我还不得不删除:

recyclerView.setHasFixedSize(true);

希望对您有所帮助:)

在我的例子中,我在适配器中设置列表后没有调用 notifyDataSetChanged()

public void setUserList(List<UserList> userList) {
      this.userList = userList;
        notifyDataSetChanged();
}

在我的例子中,我错过了在我的 LinearLayout 中设置方向。

添加方向后问题已解决。

 android:orientation="vertical"

我的问题是 RecyclerView 的 layout_heightlayout_width 设置为 0dp

我遇到了一个问题,因为我自己设置了布局并放置了

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/band_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</androidx.recyclerview.widget.RecyclerView>

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/band_recycler_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:textAlignment="center">

解决了我的问题

你忘记了 xml 中的这一行 app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"

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

主要情况并非如此 post,但它可能对某些人有用。 如果设置 setHasStableIds(true);,覆盖 getItemId(position) 是适配器。

您可以将其添加到您的 XML 小部件 RecyclerView

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

或手动

reyclerview.setLayoutManager(new LinearLayoutManager(ActivityName.this));

在我的例子中,我从片段的 onCreateView 返回 null。

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding=DataBindingUtil.inflate(inflater,R.layout.fragment_add_budget,container,false)
        setRecyclerView()
        return null// that was the culprit
    }

我的回答不适用于您,但可能适用于其他人,因为我遇到了与您面临的相同问题。

所以我确实做到了:

RecyclerView rv = new RecyclerView(this);

而不是

RecyclerView rv = findViewById(R.id.Recycler);

所以一定要记下这一点。