Recyclerview不调用onCreateViewHolder

我的RecyclerView没有调用onCreateViewHolderonBindViewHolder甚至MenuViewHolder构造函数,因此在RecyclerView中什么都没有出现。 我放置了用于调试的日志,但没有显示日志。 有什么问题吗?< / p >

我的适配器:

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;
}
113913 次浏览

你的getItemCount方法returns 0。所以RecyclerView从不尝试实例化视图。使它返回greater than 0

例如

@Override
public int getItemCount() {
return data.size();
}

不管它的价值是什么,当我设置回收视图适配器之前时,我观察到适配器实际上是初始化的。解决方案是确保recyclerView.setAdapter(adapter)是用一个非空适配器调用的

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

recycler.setLayoutManager(new LinearLayoutManager(this));

custom.xmlRecyclerView中设置TextView的高度。如果height为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);

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

请设置布局管理器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发送这个列表objetc,验证你是否有正确的引用,例如

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


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

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

我有同样的问题,因为我在布局资源中使用android.support.constraint.ConstraintLayout。 更改为FrameLayout有帮助
在我的情况下,我的列表大小为0,它没有调用onCreateViewHolder 方法。我需要在空列表的中心显示一条消息作为占位符,所以我这样做了,它就像魅力一样。

  @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();
}

将此添加到您的适配器类

 @Override
public int getItemCount() {
return mDataset.size();
}

我忘记在下面添加,我添加后,它为我工作

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

我的encouter是RecyclerView的onBindViewHolder(holder, position)覆盖方法。没有调用适配器。方法onCreateViewHolder被调用,getItemCount被调用。如果你阅读了Recyclerview适配器的规格,你会了解到如果你覆盖了onBindViewHolder(holder, position, List payload)将被调用。所以请小心。

看到我的答案,如果你正在使用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作为你的列表的高度以及你的项目列表的高度,什么都不会显示,你的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以区分它,问题解决了!

< p > recyclerView.setAdapter(适配器);被称为 通过调用方法填充recyclerView列表

确保你的XMLKoltin/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();
}

在我的情况下,我错过了设置方向在我的线性布局。

添加方向问题后修正。

 android:orientation="vertical"

我的问题是回收视图的layout_heightlayout_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中忘记了这一行 应用:layoutManager =“androidx.recyclerview.widget.LinearLayoutManager" < / p >

    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"

主帖中没有这种情况,但它可能对某些人有用。 如果设置了setHasStableIds(真正的);,则重写getItemId(位置)为适配器

您可以将其添加到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);

所以一定要记下来。

对于那些在Kotlin中遇到这个问题的人,可以使用下面的代码:

recycler.layoutManager = LinearLayoutManager(context)

注意,即使你的recyclerView使用constraintLayout,你也可以使用LinearLayoutManager。