当前位置: 首页 > 知识库问答 >
问题:

RecyclerView未调用getItemCount

杜正奇
2023-03-14

我已经研究了这个问题的几个SO答案(这里、这里和这里),但没有一个提议的解决方案奏效。我的问题是我的RecyclView列表项没有显示。我在MessengerRecyclAdapter、onCreateViewHolder、onBindViewHolder和getItemCount中设置了断点,并且只调用了第一个。在断点中,我输入了表达式评估器并执行

MessengerRecyclerAdapter.getItemCount();

并得到了预期的答案20。RecyclerView本身占据了预期的内容区域,如下面的屏幕截图所示(我将RecyclerView变成了洋红色,以突出显示它所占据的空间)。

我的RecyclerView XML代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

<android.support.v7.widget.RecyclerView
    android:id="@+id/thread_list"
    android:background="@color/colorAccent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:name="com.jypsee.jypseeconnect.orgPicker.MessengerListFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    tools:context="com.jypsee.jypseeconnect.orgPicker.MessengerListFragment"
    tools:listitem="@layout/fragment_messenger_cell"/>

</LinearLayout>

My RecyclerView Cell XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:orientation="horizontal">

<TextView
    android:id="@+id/id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/text_margin"
    android:textAppearance="?attr/textAppearanceListItem"
    android:textColor="@color/blueText"/>

<TextView
    android:id="@+id/content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/text_margin"
    android:textAppearance="?attr/textAppearanceListItem"
    android:textColor="@color/darkText"/>
</LinearLayout>

我的列表片段类:

    @Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {

    List<DummyContent.DummyItem> items = new ArrayList<>();
    for (Integer i = 0; i<20; i++){
        DummyContent.DummyItem item = new DummyContent.DummyItem(i.toString(),"Content","Details");
        items.add(item);
    }

    View view = inflater.inflate(R.layout.fragment_messenger_list, container, false);
    mRecyclerView = (RecyclerView) view.findViewById(R.id.thread_list);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerAdapter = new MessengerThreadRecyclerAdapter(items, mListener);
    mRecyclerView.setAdapter(mRecyclerAdapter);
    mRecyclerAdapter.notifyDataSetChanged();
    return view;
}

我的适配器类:

public class MessengerRecyclerAdapter
    extends RecyclerView.Adapter<MessengerRecyclerAdapter.MessageThreadHolder>{

private final List<DummyItem> mValues;
private final RecyclerViewClickListener mListener;

public MessengerRecyclerAdapter(List<DummyItem> items, RecyclerViewClickListener listener) {
    mValues = items;
    mListener = listener;
}

@Override
public MessageThreadHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.fragment_messenger_cell, parent, false);
    return new MessageThreadHolder(view);
}

@Override
public void onBindViewHolder(final MessageThreadHolder holder, final int position) {
    holder.mItem = mValues.get(position);
    holder.mIdView.setText(mValues.get(position).id);
    holder.mContentView.setText(mValues.get(position).content);
    holder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mListener != null) {
                mListener.recyclerViewListClicked(v, position);
            }
        }
    });
}

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

public class MessageThreadHolder extends RecyclerView.ViewHolder {
    public final View mView;
    public final TextView mIdView;
    public final TextView mContentView;
    public DummyItem mItem;

    public MessageThreadHolder(View view) {
        super(view);
        mView = view;
        mIdView = (TextView) view.findViewById(R.id.id);
        mContentView = (TextView) view.findViewById(R.id.content);
    }
}

}

如您所见,我已将linearLayout方向设置为垂直,并设置布局管理器,这是两种最常见的解决方案。我真的不知道下一步该做什么,所以非常感谢您的帮助。

共有2个答案

吕征
2023-03-14

在我的例子中,在适配器中设置列表后,我缺少调用通知DataSetChanged()。

曾嘉福
2023-03-14

正如我在之前的答案编辑中所说。问题出在您的xml中。它没有显示的主要原因是,您试图使用包含标签而不是片段标签添加片段,因此在将片段布局添加到您的活动中时,永远不会调用相应的片段类。下面是正确添加片段所需的代码。

<fragment
        android:id="@+id/message_thread"
        android:name="com.jypsee.jypseeconnect.orgPicker.MessengerThreadListFragment"
        layout="@layout/fragment_messengerthread_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_messengerthread_list" />

你的片段布局应该是这样的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".orgPicker.MessengerThreadListFragment">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/thread_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
 类似资料:
  • 我的不调用、甚至构造函数,因此中不显示任何内容。我放了日志进行调试,但没有显示日志。可能是什么问题? 我的适配器: 我的自定义行XML: 而我的片段:

  • 我想单击按钮将添加到中,但未调用适配器的实现方法。 这是我的代码: CourseDetailAdapter。班 我想为输入数据添加layout,所以我不确定是否正确

  • 我正在从Firebase数据库获取一些数据,并试图用它填充适配器。在适配器的被调用后,屏幕闪烁,什么也没发生,我甚至无法在onBindViewHolder中捕捉到断点。 这是我的代码: POJO类: } 这是我的活动布局,称为“活动结果”。包含RecyclerView的xml 这是我的Adapters ViewHolder布局,名为score_view_holder。xml 因此,它将包含两个水平

  • 我试图使用Reform2显示来自虚拟服务器(JSON服务器)的JSON数据,并将其显示在片段中的RecyclerView中。到目前为止,正在发生以下事件(使用日志信息发现): 主片段<代码>字符片段(CharactersListFragment)。kt创建已启动 只调用了。它正在返回0 未调用OnCreateViewHolder()和onBindViewHolder() 成功地从服务器获取数据并将

  • 没有任何错误,所有数据似乎都有效。出于某种原因,正在调用与视图相关的其他方法。我已经确保了以下几点: > > 正在调用构造函数,成员变量有效。 父视图是垂直线性布局;没有scrollview,或任何其他具有自己滚动属性的视图。 包含片段的视图被创建并显示在屏幕上。 下面是片段中的声明,后跟适配器。任何帮助都将不胜感激,因为这完全令人困惑。

  • 当我的设备联机时,RecyclerView适配器会按预期工作。脱机时,不会调用onCreateViewHolder。 首先,我知道这一点:Recyclerview不会调用CreateViewHolder,这不是问题所在。getItemCount()返回一个数字 所以,它似乎与在线/离线状态有关,但我无法弄清楚如何。这是适配器: