RecyclerView不会调用onCreateViewHolder

我的RecyclerView不要调用onCreateViewHolderonBindViewHolder甚至是MenuViewHolder构造函数,因此在RecyclerView中不会出现任何东西。 我把日志进行debugging,并没有显示日志。 可以是什么? 我的适配器:

 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", "Construtor"); inflater = LayoutInflater.from(context); Log.i("DEBUG MENU - CONSTRUTOR", inflater.toString()); this.data = data; for(Menu menu: this.data){ Log.i("DEBUG MENU - CONSTRUTOR", 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永远不会尝试实例化一个视图。 让它返回greater than 0东西。

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

 recycler.setLayoutManager(new LinearLayoutManager(this)); 

FWIW,我在实际初始化适配器之前设置了回收器视图适配器时观察到它。 解决scheme是确保recyclerView.setAdapter(adapter)被一个非空的适配器调用

这不适用于您的具体情况。 但是这可能会帮助别人。

这个原因可能是以下方法的粗心使用

 recyclerView.setHasFixedSize(true); 

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

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

当我的RecyclerView在一个ScrollView里面,并且我正在使用Android Support Library 23.0时,发生了这种情况。 要修复,我更新到Android支持库23.2:

在build.gradle:

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

请将布局pipe理器设置为RecyclerView,如下面的代码所示:

RecyclerView recyclerView =(RecyclerView)findViewById(R.id.recycler_view_right); NavigationAdapter adapter = new NavigationAdapter(this,FragmentDrawer.getData()); recyclerView.setAdapter(适配器); recyclerView.setLayoutManager(新的LinearLayoutManager(this));

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

在我的情况下,我把我的RecyclerView的ID设置为“recyclerView”。 看起来这个ID已经在某个地方定义了,因为当我把它改成不同的ID时,适配器的方法被正确调用了。

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

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

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

在我的情况下,我的列表大小是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;