Recyclerview не вызывает onCreateViewHolder



Мой RecyclerView не звонит onCreateViewHolder, onBindViewHolder даже MenuViewHolder конструктор, поэтому в RecyclerView ничего не появляется.
Я ставлю журналы для отладки, и никакой журнал не отображается.
В чем может быть проблема?



Мой адаптер:



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;
}
565   22  

22 ответов:

Ваш getItemCount Метод returns 0. Поэтому RecyclerView никогда не пытается создать экземпляр представления. Пусть он вернет что-нибудь greater than 0.

Например

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

Еще один - убедитесь, что вы установили layout manager в RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

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

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

FWIW, я наблюдал это, когда устанавливал адаптер вида recycler Перед тем, как адаптер был фактически инициализирован. Решение состояло в том, чтобы убедиться, что recyclerView.setAdapter(adapter) вызывается с ненулевым адаптером

Это не относится к вашему конкретному случаю. Но это может помочь кому-то еще.

Этой причиной может быть небрежное использование следующего метода

recyclerView.setHasFixedSize(true);

Если не использовать с осторожностью, это может привести к тому, что onBindView и onCreateViewHolder не будут вызываться вообще, без ошибок в журналах.

Установка высоты TextView в custom.xml или RecyclerView. Если высота равна wrap-content, то RecyclerView не будет видно.

Это произошло, когда мой RecyclerView был внутри ScrollView, и я использовал библиотеку поддержки Android 23.0. Чтобы исправить это, я обновил библиотеку поддержки Android 23.2:

В сборке.грэдл:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}

У меня была та же проблема, потому что я использовал android.support.constraint.ConstraintLayout в макете ресурса. Изменение на FrameLayout помогло.

Добавьте это в класс адаптера

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

Пожалуйста, установите layout manager в RecyclerView, как показано ниже кода:

RecyclerView recyclerView = (RecyclerView) findViewById (R. id. recycler_view_right); NavigationAdapter adapter = новый NavigationAdapter (это, FragmentDrawer.метод GetData()); recyclerView.setAdapter (адаптер); recyclerView.setLayoutManager (new LinearLayoutManager (this));

Смотрите мой ответ, если вы используете библиотеку привязки данных 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);
        }
    }

Счастливое кодирование : -)

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

Другой вариант-если вы отправляете этот список objectc с помощью get, проверьте правильность ссылки, например

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

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

При использовании пользовательского адаптера не забудьте установить значение ItemCount в соответствии с размером вашей коллекции.

В моем случае размер списка был равен 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();
}

Моим encouter был onBindViewHolder (держатель , позиция) переопределенный метод RecyclerView.адаптер не вызывается. Был вызван метод onCreateViewHolder, getItemCount. Если вы прочитаете спецификации для адаптера Recyclerview, вы узнаете,что если вы переопределили onBindViewHolder( держатель, позиция, список полезных нагрузок), он будет вызван в пользу. Поэтому, пожалуйста, будьте осторожны.

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

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

Моя ошибка заключалась в завышении неправильный взгляд на фрагмент onCreateView.

Возможно, это кому-то поможет, но если вы установите видимость RecycleView в GONE, методы адаптера вообще не будут вызываться... Мне потребовалось некоторое время, чтобы понять это.

Comments

    Ничего не найдено.