it-swarm.com.ru

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);
    }
}
47
Conti

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

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

recyclerView.setAdapter(adapter);

А потом:

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

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

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

Заказ отменен

74
Aerim

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

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

recyclerView.setLayoutManager(new LinearLayoutManager(this));

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

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

26
ralphgabb

Убедитесь, что вы перезапускаете представление не дочернее от 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"/>

19
raditya gumay

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

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

11
Abdul-Rahman Ahmad

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

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

recyclerView.setHasFixedSize(true);

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

7
Venkatesh Shukla

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

4
Vijay Pal

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

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

2
Rafael Ruiz Muñoz

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

2
Meriam

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

1
David

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

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

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

Удачи!

1
bemihai22

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

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

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

1
Prashant Paliwal

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

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

0
Mateusz Wlodarczyk

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

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

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

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
Убедитесь, что ваш ресайклер не вложен в слишком много макетов, которые могут вызвать путаницу, такую ​​как сочетание 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>
0
Jonathan Kibet

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

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

0
Daniil

У меня была такая же проблема, когда ни 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);
0
dpspae03

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

0
Siamak Ferdos