Recyclerview不会调用onCreateViewHolder

时间:2015-01-07 00:18:02

标签: java android android-recyclerview

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

31 个答案:

答案 0 :(得分:349)

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

recycler.setLayoutManager(new LinearLayoutManager(this));

答案 1 :(得分:192)

您的getItemCount方法returns 0。因此RecyclerView永远不会尝试实例化视图。让它返回greater than 0

例如

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

答案 2 :(得分:36)

我添加它为我工作后忘记添加以下行

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

答案 3 :(得分:9)

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

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

recyclerView.setHasFixedSize(true);

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

答案 4 :(得分:8)

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

答案 5 :(得分:5)

0_start 2_start 1_start 4_start 3_start TextView中设置custom.xml的高度。如果高度为RecyclerView,则wrap-content将不可见。

答案 6 :(得分:4)

RecyclerView位于ScrollView内且我使用的是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.+'
}

答案 7 :(得分:4)

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

答案 8 :(得分:4)

将此添加到您的适配器类

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

答案 9 :(得分:3)

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

答案 10 :(得分:3)

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

答案 11 :(得分:2)

如果您使用的是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);
        }
    }

快乐编码: - )

答案 12 :(得分:2)

我在这个问题上挣扎了好几个小时。我正在使用片段。而问题并没有归还[ moment("2017-10-20T07:00:00.000"), moment("2017-10-20T07:30:00.000"), moment("2017-10-20T08:00:00.000"), moment("2017-10-20T08:30:00.000"), moment("2017-10-20T09:00:00.000"), moment("2017-10-20T09:30:00.000"), ... moment("2017-10-20T19:30:00.000"), moment("2017-10-20T20:00:00.000"), moment("2017-10-20T20:30:00.000"), moment("2017-10-20T21:00:00.000"), moment("2017-10-20T21:30:00.000"), moment("2017-10-20T22:00:00.000") ] 。以下是我的代码:

view

答案 13 :(得分:2)

其他选项是如果您使用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;
}

答案 14 :(得分:1)

如果您将wrap_content作为列表的高度以及项目列表的高度,则不会显示任何内容,也不会调用您的recyclerView函数。修复项目的高度或将match_parent放入列表高度。这解决了我的问题。

答案 15 :(得分:1)

转到您的xml。并更改布局以包装内容。一个元素隐藏了下一个元素,因此方法不起作用!

答案 16 :(得分:1)

我的encouter是未被调用的RecyclerView.adaptor的onBindViewHolder(holder,position)覆盖方法。方法onCreateViewHolder被调用,getItemCount被调用。如果您阅读了Recyclerview适配器的规格,您将了解到如果您已覆盖onBindViewHolder(持有者,位置,列表有效负载)将被调用。所以请小心。

答案 17 :(得分:1)

就我而言,我的列表大小为0,并且没有调用onCreateViewHolder 方法。我需要在空心列表的中心显示一条消息作为占位符,所以我这样做就像魅力一样。回答@Konstantin Burov的帮助。

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

答案 18 :(得分:1)

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

答案 19 :(得分:0)

请做以下事情

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

答案 20 :(得分:0)

在我将Activity更改为使用ViewModel和DataBinding的情况下,我忘记从setContentView方法中删除onCreate方法调用。通过删除它,我的问题得以解决。

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

答案 23 :(得分:0)

我真的真的希望这一天能对某人有所帮助。我只是花了一个多小时来疯了!

我有这个:

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

当我应该有这个时:

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

因为我愚蠢地称我的适配器adapter,所以它被Apply块中的回收者视图的适配器遮盖了!我将适配器重命名为projectAdapter,以区分它并解决问题!

答案 24 :(得分:0)

recyclerView.setAdapter(adapter);叫 通过调用方法填充recyclerView列表。

答案 25 :(得分:0)

确保您的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);

我希望这可以为您提供帮助:)

答案 26 :(得分:0)

在我的情况下,我在适配器中设置列表后缺少调用notifyDataSetChanged()

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

答案 27 :(得分:0)

就我而言,我想在LinearLayout中设置方向。

添加方向问题后已修复。

 android:orientation="vertical"

答案 28 :(得分:0)

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

答案 29 :(得分:0)

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

<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">

解决了我的问题

答案 30 :(得分:0)

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

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