RecyclerView不会调用onCreateViewHolder
我的RecyclerView
不要调用onCreateViewHolder
, onBindViewHolder
甚至是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
使用,这可能会导致onBindView
和onCreateViewHolder
根本不被调用,在日志中没有错误。
在custom.xml
或RecyclerView
设置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;