Подтвердить что ты не робот

RecyclerView не вызывает onCreateViewHolder или onBindView

Не получается никаких ошибок, и все данные кажутся действительными. По какой-то причине вызываются методы, связанные с представлением. Я убедился в следующем:

  • getItemCount() - это единственный метод-адаптер, который вызывается и возвращает положительное целочисленное значение (я знаю, что это будет та область, которую вы, ребята, будете смотреть)

    • Вызывается конструктор, действительны переменные-члены.

    • Родительский просмотр - это вертикальный LinearLayout; нет прокрутки или любого другого вида со своими собственными свойствами прокрутки в поле зрения.

    • содержащий представление фрагмента создается и отображается на экране.

Вот объявление в фрагменте, за которым следует адаптер. Любая помощь будет оценена по достоинству, так как это будет полностью озадачено.

SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
private static final String TAG = String.format("==> %S", SubMenuAdapter.class.getSimpleName());

private final List<ContentItem> mContentItems;
private Context mContext;

public SubMenuAdapter(Context context, List<ContentItem> contenItems) {
    Log.d(TAG, "Constructor called");
    mContentItems = contenItems;
    mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder called");
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_resource_efficiency, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder called");

    ContentItem item = mContentItems.get(position);
    holder.textName.setText(item.getName());
    FontSetter.setMyriadProRegular(mContext, holder.textName);
    Picasso.with(mContext).load("file://" + item.getPreviewImageDefault()).into(holder.imageIcon);
}

@Override
public int getItemCount() {
    Log.d(mContext, String.format("getItemCount: %d", mContentItems.size()));
    return mContentItems.size();
}

// ViewHolder
public static class ViewHolder extends RecyclerView.ViewHolder {

    TextView textName;
    ImageView imageIcon;

    public ViewHolder(View view) {
        super(view);
        textName = (TextView) view.findViewById(R.id.tv_resource_efficiency_option);
        imageIcon = (ImageView) view.findViewById(R.id.iv_resource_efficiency_icon);
    }
}
4b9b3361

Ответ 1

Это также может помочь кому-то

Первое использование

recyclerView.setAdapter(adapter);

И затем:

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

Итак, это будет выглядеть так:

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

Порядок обратный

Ответ 2

Гонялся за ответом более часа.

Не забудьте назвать этот лайнер перед установкой адаптера.

recyclerView.setLayoutManager(new LinearLayoutManager(this));

Похоже, что в представлении реселлера нет встроенного менеджера компоновки по умолчанию, поэтому мы должны добавить его программно.

Приветствия, если вы нашли это полезным.

Ответ 3

Убедитесь, что просмотр в корзине не является дочерним по отношению к nestedscrollview

например, этот код не будет работать.

<android.support.v4.widget.NestedScrollView
    android:id="@+id/responder_scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/darkGray"
    android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            app:cardElevation="@dimen/spacing_medium"
            app:cardUseCompatPadding="true">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/responder_testimonial"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:text="Testimonial"
                    android:textSize="@dimen/general_font_size" />

                <TextView
                    android:id="@+id/responder_counter_testimonial"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@+id/responder_testimonial"
                    android:text="170"
                    android:textSize="@dimen/general_font_size_small" />

                <Button
                    android:id="@+id/responder_btn_testimonial"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentTop="true"
                    android:text="Go" />

               <view
                    android:id="@+id/responder_list_testimonial"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_below="@+id/responder_testimonial"
                    class="android.support.v7.widget.RecyclerView"/>
            </RelativeLayout>
        </android.support.v7.widget.CardView>

    </FrameLayout>
</android.support.v4.widget.NestedScrollView>

то я использую

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<view
    android:id="@+id/responder_list_testimonial"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/responder_testimonial"
    class="android.support.v7.widget.RecyclerView"/>

Ответ 4

Я не знаю, поможет ли это кому-либо, но у меня почти такая же проблема. Моя проблема не была ни в фрагменте/классе, ни в адаптере recycler. Проблема заключалась в родительском XML-макете, где панель действий приняла match_parent, где FrameLayout, в котором был заменен фрагмент, не получил доступного места для показа. Вот почему методы не вызывались.

Я думаю, что подобные сценарии могут иметь место для тех, кто сталкивается с одной и той же проблемой. Двойная проверка каждой ширины и высоты в каждом XML файле может находиться в одном и том же дереве, так как проблема вообще не связана с адаптером.

Ответ 5

Мои две гроши здесь. Просто потратил более трех часов на отладку.

Убедитесь, что вы не использовали следующую строку небрежно.

recyclerView.setHasFixedSize(true);

Установите фиксированный размер только тогда, когда вы уверены, что представление будет иметь постоянный размер. Если это не так, методы onCreateViewHolder и onBindView могут вообще не вызываться.

Ответ 6

Я также столкнулся с той же проблемой, когда метод onCreateViewHolder или onBindView не вызывал вызов, вызывался только getItemCount. Таким образом, в основном возникла проблема с высотой и весом RecyclerView, который был установлен на wrap_content или 0dp. После изменения его на некоторое значение исправлена ​​проблема.

Ответ 7

Это уже очень старая версия, но в моем случае я использовал ConstraintLayout а высота была установлена неправильно, поэтому у моего представления было бы 0dp а затем адаптер 0dp бы свою работу, так как представление - 0dp.

Убедитесь, что высота и ширина в порядке, а RecyclerView имеет положительный размер.

Ответ 8

Если вы укажете wrap_content как высоту вашего списка, а также высоту вашего списка элементов, ничего не будет отображаться, и никакие ваши функции recyclerView не будут вызваны.

Ответ 9

Я знаю, что эта тема старая, но если вы сделали ту же ошибку ученика, как и я, вы можете найти это полезным.

Когда я учился на каком-то веб-сайте о RecyclerView и копировал некоторый код и адаптировался к моему контексту, я создал разные переменные (например, пользователи и данные), которые должны были делать то же самое, за исключением того, что некоторые методы вызывали данные, а некоторые вызывали пользователей. Это простая ошибка, когда вы пытаетесь понять другие функции кода и java (это происходит со мной все время).

Хорошо знать, что вы можете печатать на своей консоли в любом месте своего Java-кода, так что вы можете легко отлаживать это.

Удачи!

Ответ 10

В моем случае это было использование setHasStableIds (true); в адаптере, когда некоторые элементы списка возвращали -1 в getItemID(), поэтому я полагаю, что RecyclerView думал, что они равны.

Ответ 11

При реализации FirebaseListAdapter необходимо позаботиться о следующих пунктах, чтобы правильно его настроить.

  1. Проверьте правильность всех атрибутов recyclerview в xml. Например, не используйте содержимое переноса для высоты и ширины.
  2. Пожалуйста, проверьте, установлен ли layoutManager и позаботился ли о setHasFixedSize().
  3. Создайте переменные класса POJO, чтобы они соответствовали дочерним атрибутам firebase.
  4. FirebaseRecyclerOptions настроен.
  5. FirebaseRecyclerAdapter onCreateViewHolder() и onBindViewHolder находятся там.
  6. События жизненного цикла позаботятся о.

Note- Использование wrap_content в качестве высоты окна просмотра является одной из самых простых ошибок, которую может сделать любой. Поэтому сначала проверьте это.

Ответ 12

Будьте осторожны с тем, что вы работаете с адаптером.
В моем случае проблема заключалась в вызове notifyDataSetChanged() из действия, когда мои данные поступали из службы. На самом деле метод вызывался из фонового потока. Но приложение не зависало, и в Logcat ничего не было (!).
Поэтому я был вызван notifyDataSetChanged() в потоке пользовательского интерфейса, и проблема решена.

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

Ответ 13

У меня была такая же проблема, когда вызывались ни onCreateViewHolder, ни onBindViewHolder. Изменение метода onCreateViewHolder для использования Контекста, в котором вы сохранили ссылку в конструкторе, вместо того, чтобы делать parent.getContext(), следует исправить:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder called");
    View view = LayoutInflater.from(mContext).inflate(R.layout.row_resource_efficiency, parent, false);
    return new ViewHolder(view);

Ответ 14

В моем случае я установил идентификатор моего RecyclerView в "recyclerView". Кажется, что этот идентификатор уже определен где-то, потому что когда я изменил его на другой ID, методы из адаптера были вызваны должным образом.

Ссылка на ответ

Ответ 15

Недавно я столкнулся с этой проблемой и, видимо, существует много возможных причин. Попробуйте одну или несколько комбинаций этих опций, посмотрите, какие из них работают для вас:)

1. Менеджер макетов
Убедитесь, что вы настроили диспетчер компоновки на вид вашего ресайклера ниже

// create a layout manager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(my_context);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

// get recycler view
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
// set
recyclerView.setLayoutManager(linearLayoutManager);

2. Фиксированный размер
Убедитесь, что вы указали, имеет ли вид вашего ресайклера фиксированный размер или нет.

// set fixed size
recyclerView.setHasFixedSize(true); // or false depending on implementation

3. XML
Убедитесь, что ваш recycler не вложен в слишком много макетов, что может вызвать путаницу, например сочетание ScrollView и RelativeLayout. Сделайте это простым, посмотрите, исправляет ли он вашу проблему

<?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">

<android.support.v7.widget.RecyclerView
android:id="@+id/thread_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

Ответ 16

В моем случае был Fragment с RecyclerView внутри ViewPager. Проблема появилась, потому что я использовал Fragment.getFragmentManager() вместо Fragment.getChildFragmentManager для моего конструктора FragmentStatePagerAdapter.

PS Использование Layout Inspector может помочь при устранении подобных проблем.

Ответ 17

В моем случае после изменения Activity на ViewModel и использования Binding я забыл удалить setContentView из метода onCreate. Удалив его, моя проблема решена.

Ответ 18

если вы используете макет ограничения, когда вы установили высоту возвратного окна в соответствии с parent (0) эта проблема возникает