Recyclerview不会调用onCreateViewHolder

Mal*_*qui 135 java android android-recyclerview

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的自定义行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"/>
Run Code Online (Sandbox Code Playgroud)

和我的碎片:

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;
}
Run Code Online (Sandbox Code Playgroud)

Lay*_*ros 373

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

recycler.setLayoutManager(new LinearLayoutManager(this));
Run Code Online (Sandbox Code Playgroud)

  • 我太频繁地回到这个答案了…… (16认同)
  • 指定布局管理器的另一种方法可以是像这样的 xml 属性: app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" (3认同)
  • 这甚至不在任何教程中;人们应该如何知道这一点?几乎所有 Android 模式都是如此 (2认同)

Kon*_*rov 210

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

例如

@Override
public int getItemCount() {
    return data.size();
}
Run Code Online (Sandbox Code Playgroud)

  • 天啊,我现在觉得这么笨!:facepalm:谢谢你! (16认同)
  • 我刚刚失去了一个小时,因为getItemCount低于所有其他代码,我没有看到它.:| (3认同)
  • 我的项目数仍然是3仍然不可见,onBind或onCreateHolder没有调试点...但是它来自getItemCount (2认同)

Sai*_*i N 38

我添加它为我工作后忘了添加下面的行

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
Run Code Online (Sandbox Code Playgroud)

  • 这个答案与[@Lay Leangsros _above one_](/sf/answers/2298946891/)答案有何不同? (9认同)

the*_*_mr 18

我真的希望有一天这能帮助某人。我刚刚花了一个多小时来解决这个问题!

我有这个:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }
Run Code Online (Sandbox Code Playgroud)

当我应该有这个的时候:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }
Run Code Online (Sandbox Code Playgroud)

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

  • 就是这样。我希望 Kotlin/AndroidStudio 能够以不同的方式突出显示这一点,无论变量是来自这个块还是其他地方。 (2认同)

ven*_*nky 13

这不适用于您的特定情况.但这可能会帮助别人.

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

recyclerView.setHasFixedSize(true);
Run Code Online (Sandbox Code Playgroud)

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


bre*_*ine 10

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


kip*_*ip2 9

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


小智 9

请设置布局管理器为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));
Run Code Online (Sandbox Code Playgroud)


小智 5

设置的高度TextViewcustom.xmlRecyclerView.如果高度为wrap-content,RecyclerView则不可见.