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);
}
}
Ответы
Ответ 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 необходимо позаботиться о следующих пунктах, чтобы правильно его настроить.
- Проверьте правильность всех атрибутов recyclerview в xml. Например, не используйте содержимое переноса для высоты и ширины.
- Пожалуйста, проверьте, установлен ли layoutManager и позаботился ли о setHasFixedSize().
- Создайте переменные класса POJO, чтобы они соответствовали дочерним атрибутам firebase.
- FirebaseRecyclerOptions настроен.
- FirebaseRecyclerAdapter onCreateViewHolder() и onBindViewHolder находятся там.
- События жизненного цикла позаботятся о.
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)
эта проблема возникает