Recyclerview 不调用 onCreateViewHolder
Recyclerview not call onCreateViewHolder
我的 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);
}
}
我的自定义行 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
从不尝试实例化视图。让它 return 变成 greater than 0
.
例如
@Override
public int getItemCount() {
return data.size();
}
对于它的价值,我在 适配器实际初始化之前 设置回收器视图适配器时观察到了它。解决方案是确保使用非空适配器
调用 recyclerView.setAdapter(adapter)
另一个是确保将布局管理器设置为 RecyclerView:
recycler.setLayoutManager(new LinearLayoutManager(this));
在custom.xml
或RecyclerView
中设置TextView
的高度。如果高度为 wrap-content
,则 RecyclerView
将不可见。
当我的 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.+'
}
这不适用于您的特定情况。但这可能会对其他人有所帮助。
这个原因可能是使用了下面的方法不小心
recyclerView.setHasFixedSize(true);
如果不小心使用,这可能会导致 onBindView
和 onCreateViewHolder
根本不被调用,日志中也没有错误。
请将布局管理器设置为 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));
在我的例子中,我将 RecyclerView 的 ID 设置为 "recyclerView"。似乎这个 ID 已经在某处定义了,因为当我将它更改为不同的 ID 时,来自适配器的方法被正确调用。
其他选项是,如果您使用 get 发送此列表对象,请验证您是否有正确的引用,例如
private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
listObjetc = listObjetc;
}
//Correct
public void setListObjetcs(list<objetc> listObjetc){
this.listObjetc = listObjetc;
}
如果使用自定义适配器,请不要忘记将 ItemCount 设置为 collection 的大小。
我遇到了同样的问题,因为我在布局资源中使用了 android.support.constraint.ConstraintLayout
。
更改为 FrameLayout
有帮助。
在我的例子中,我的列表大小是 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;
请做以下事情
@Override
public int getItemCount() {
return data.size();
}
将此添加到您的适配器Class
@Override
public int getItemCount() {
return mDataset.size();
}
我在添加对我有用后忘记添加下面的行
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
我遇到的是 RecyclerView.adaptor 的 onBindViewHolder( holder , position) 覆盖方法未被调用。调用了 onCreateViewHolder 方法,调用了 getItemCount。如果你阅读了 Recyclerview Adapter 的规范,你会了解到如果你重写了 onBindViewHolder( holder, position, List payloads) 将被调用以支持。所以请小心。
如果您正在使用 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);
}
}
编码愉快:-)
如果您将 wrap_content 作为列表的高度以及项目列表的高度,则不会显示任何内容,并且会调用 none 的 recyclerView 函数。固定项目的高度或将 match_parent 作为列表高度。那解决了我的问题。
在我的例子中,在将 Activity 更改为使用 ViewModel 和 DataBinding 后,我忘记删除从 onCreate
方法调用的 setContentView
方法。删除它我的问题就解决了。
我的错误是在 Fragment onCreateView 中夸大了错误的视图。
也许它对某人有帮助,但如果您将 RecycleView 的可见性设置为 GONE,则根本不会调用适配器方法...我花了一些时间才弄明白。
对我来说,这是因为
setHasStableIds(真);
方法已设置。
删除它,它将起作用
我真的真的希望有一天这对某人有所帮助。我只花了一个多小时就搞砸了!
我有这个:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = adapter
}
我什么时候应该有这个:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = projectAdapter
}
因为我愚蠢地调用了我的适配器 adapter
,它在应用块中被回收器视图的适配器隐藏了!我将适配器重命名为 projectAdapter 以区分它并解决问题![=13=]
recyclerView.setAdapter(适配器);称为
通过调用方法填充 recyclerView 列表。
确保您的 XML
和 Koltin/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);
希望对您有所帮助:)
在我的例子中,我在适配器中设置列表后没有调用 notifyDataSetChanged()
。
public void setUserList(List<UserList> userList) {
this.userList = userList;
notifyDataSetChanged();
}
在我的例子中,我错过了在我的 LinearLayout 中设置方向。
添加方向后问题已解决。
android:orientation="vertical"
我的问题是 RecyclerView 的 layout_height
和 layout_width
设置为 0dp
。
我遇到了一个问题,因为我自己设置了布局并放置了
<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">
解决了我的问题
你忘记了 xml 中的这一行
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
或
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
主要情况并非如此 post,但它可能对某些人有用。
如果设置 setHasStableIds(true);,覆盖 getItemId(position) 是适配器。
您可以将其添加到您的 XML 小部件 RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
或手动
reyclerview.setLayoutManager(new LinearLayoutManager(ActivityName.this));
在我的例子中,我从片段的 onCreateView 返回 null。
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding=DataBindingUtil.inflate(inflater,R.layout.fragment_add_budget,container,false)
setRecyclerView()
return null// that was the culprit
}
我的回答不适用于您,但可能适用于其他人,因为我遇到了与您面临的相同问题。
所以我确实做到了:
RecyclerView rv = new RecyclerView(this);
而不是
RecyclerView rv = findViewById(R.id.Recycler);
所以一定要记下这一点。
我的 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);
}
}
我的自定义行 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
从不尝试实例化视图。让它 return 变成 greater than 0
.
例如
@Override
public int getItemCount() {
return data.size();
}
对于它的价值,我在 适配器实际初始化之前 设置回收器视图适配器时观察到了它。解决方案是确保使用非空适配器
调用recyclerView.setAdapter(adapter)
另一个是确保将布局管理器设置为 RecyclerView:
recycler.setLayoutManager(new LinearLayoutManager(this));
在custom.xml
或RecyclerView
中设置TextView
的高度。如果高度为 wrap-content
,则 RecyclerView
将不可见。
当我的 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.+'
}
这不适用于您的特定情况。但这可能会对其他人有所帮助。
这个原因可能是使用了下面的方法不小心
recyclerView.setHasFixedSize(true);
如果不小心使用,这可能会导致 onBindView
和 onCreateViewHolder
根本不被调用,日志中也没有错误。
请将布局管理器设置为 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));
在我的例子中,我将 RecyclerView 的 ID 设置为 "recyclerView"。似乎这个 ID 已经在某处定义了,因为当我将它更改为不同的 ID 时,来自适配器的方法被正确调用。
其他选项是,如果您使用 get 发送此列表对象,请验证您是否有正确的引用,例如
private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
listObjetc = listObjetc;
}
//Correct
public void setListObjetcs(list<objetc> listObjetc){
this.listObjetc = listObjetc;
}
如果使用自定义适配器,请不要忘记将 ItemCount 设置为 collection 的大小。
我遇到了同样的问题,因为我在布局资源中使用了 android.support.constraint.ConstraintLayout
。
更改为 FrameLayout
有帮助。
在我的例子中,我的列表大小是 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;
请做以下事情
@Override
public int getItemCount() {
return data.size();
}
将此添加到您的适配器Class
@Override
public int getItemCount() {
return mDataset.size();
}
我在添加对我有用后忘记添加下面的行
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
我遇到的是 RecyclerView.adaptor 的 onBindViewHolder( holder , position) 覆盖方法未被调用。调用了 onCreateViewHolder 方法,调用了 getItemCount。如果你阅读了 Recyclerview Adapter 的规范,你会了解到如果你重写了 onBindViewHolder( holder, position, List payloads) 将被调用以支持。所以请小心。
如果您正在使用 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);
}
}
编码愉快:-)
如果您将 wrap_content 作为列表的高度以及项目列表的高度,则不会显示任何内容,并且会调用 none 的 recyclerView 函数。固定项目的高度或将 match_parent 作为列表高度。那解决了我的问题。
在我的例子中,在将 Activity 更改为使用 ViewModel 和 DataBinding 后,我忘记删除从 onCreate
方法调用的 setContentView
方法。删除它我的问题就解决了。
我的错误是在 Fragment onCreateView 中夸大了错误的视图。
也许它对某人有帮助,但如果您将 RecycleView 的可见性设置为 GONE,则根本不会调用适配器方法...我花了一些时间才弄明白。
对我来说,这是因为 setHasStableIds(真); 方法已设置。 删除它,它将起作用
我真的真的希望有一天这对某人有所帮助。我只花了一个多小时就搞砸了!
我有这个:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = adapter
}
我什么时候应该有这个:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = projectAdapter
}
因为我愚蠢地调用了我的适配器 adapter
,它在应用块中被回收器视图的适配器隐藏了!我将适配器重命名为 projectAdapter 以区分它并解决问题![=13=]
recyclerView.setAdapter(适配器);称为 通过调用方法填充 recyclerView 列表。
确保您的 XML
和 Koltin/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);
希望对您有所帮助:)
在我的例子中,我在适配器中设置列表后没有调用 notifyDataSetChanged()
。
public void setUserList(List<UserList> userList) {
this.userList = userList;
notifyDataSetChanged();
}
在我的例子中,我错过了在我的 LinearLayout 中设置方向。
添加方向后问题已解决。
android:orientation="vertical"
我的问题是 RecyclerView 的 layout_height
和 layout_width
设置为 0dp
。
我遇到了一个问题,因为我自己设置了布局并放置了
<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">
解决了我的问题
你忘记了 xml 中的这一行 app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
或
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
主要情况并非如此 post,但它可能对某些人有用。 如果设置 setHasStableIds(true);,覆盖 getItemId(position) 是适配器。
您可以将其添加到您的 XML 小部件 RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
或手动
reyclerview.setLayoutManager(new LinearLayoutManager(ActivityName.this));
在我的例子中,我从片段的 onCreateView 返回 null。
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding=DataBindingUtil.inflate(inflater,R.layout.fragment_add_budget,container,false)
setRecyclerView()
return null// that was the culprit
}
我的回答不适用于您,但可能适用于其他人,因为我遇到了与您面临的相同问题。
所以我确实做到了:
RecyclerView rv = new RecyclerView(this);
而不是
RecyclerView rv = findViewById(R.id.Recycler);
所以一定要记下这一点。