Java Recyclerview 不调用 onCreateViewHolder
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27809524/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Recyclerview not call onCreateViewHolder
提问by Malinosqui
My RecyclerView
does not call onCreateViewHolder
, onBindViewHolder
even MenuViewHolder
constructor, therefore nothing appears in RecyclerView
.
I put logs for debugging, and no log is shown.
What might be the problem?
MyRecyclerView
不会调用onCreateViewHolder
,onBindViewHolder
甚至不会调用MenuViewHolder
构造函数,因此RecyclerView
. 我放了调试日志,没有显示日志。可能是什么问题?
My adapter:
我的适配器:
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);
}
}
My custom row XML:
我的自定义行 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"/>
and my Fragment:
和我的片段:
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;
}
采纳答案by Konstantin Burov
Your getItemCount
method returns 0
. So RecyclerView
never tries to instantiate a view. Make it return something greater than 0
.
你的getItemCount
方法returns 0
。所以RecyclerView
永远不要试图实例化一个视图。让它返回一些东西greater than 0
。
for example
例如
@Override
public int getItemCount() {
return data.size();
}
回答by kip2
For what it's worth, I observed it when I set the recycler view adapter beforethe adapter was actually initialized. Solution was to make sure recyclerView.setAdapter(adapter)
was called with a non-null adapter
对于它的价值,我在适配器实际初始化之前设置回收器视图适配器时观察到它。解决方案是确保recyclerView.setAdapter(adapter)
使用非空适配器调用
回答by Lay Leangsros
Another one is make sure you set layout manager to RecyclerView:
另一个是确保将布局管理器设置为 RecyclerView:
recycler.setLayoutManager(new LinearLayoutManager(this));
回答by jian lang
Setting the height of the TextView
in the custom.xml
or RecyclerView
. If height is wrap-content
, the RecyclerView
will not be visible.
TextView
在custom.xml
或 中设置 的高度RecyclerView
。如果 height 为wrap-content
,则RecyclerView
将不可见。
回答by J Wang
This happened when my RecyclerView
was inside a ScrollView
and I was using Android Support Library 23.0. To fix, I updated to Android Support Library 23.2:
当我RecyclerView
在 a 中ScrollView
并且使用 Android Support Library 23.0.0时发生了这种情况。为了修复,我更新到了 Android 支持库 23.2:
In build.gradle:
在 build.gradle 中:
dependencies {
...
compile 'com.android.support:appcompat-v7:23.2.+'
compile 'com.android.support:cardview-v7:23.2.+'
}
回答by venky
This does not apply for your particular case. But this might help someone else.
这不适用于您的特定情况。但这可能对其他人有所帮助。
This reason could be careless usage of the following method
这个原因可能是不小心使用了以下方法
recyclerView.setHasFixedSize(true);
If not used with caution, this might cause the onBindView
and onCreateViewHolder
to not be called at all, with no error in the logs.
如果不小心使用,这可能会导致onBindView
和onCreateViewHolder
根本不会被调用,并且日志中没有错误。
回答by Mandeep Yadav
Please set layout manager to RecyclerView
like below code:
请将布局管理器设置为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));
回答by Mateusz Wlodarczyk
In my case I set the ID of my RecyclerView to "recyclerView". It seems that this ID was already defined somewhere, because when I changed that to different ID, the methods from the adapter were called properly.
就我而言,我将 RecyclerView 的 ID 设置为“recyclerView”。似乎这个 ID 已经在某处定义了,因为当我将它更改为不同的 ID 时,来自适配器的方法被正确调用。
回答by David Hackro
Other option is if you send this list objetc using get,verify if you have correct reference,for example
其他选项是,如果您使用 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;
}
回答by Dooie
If using a custom adapter do not forget to set the ItemCount to the size of your collection.
如果使用自定义适配器,请不要忘记将 ItemCount 设置为您的集合的大小。