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

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

My RecyclerView не вызывает конструктор onCreateViewHolder, onBindViewHolder even 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;
}
4b9b3361

Ответ 1

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

например

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

Ответ 2

Еще один - убедитесь, что вы установили менеджер компоновки в RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

Ответ 3

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

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

Ответ 4

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

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

recyclerView.setHasFixedSize(true);

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

В build.gradle:

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

Ответ 8

Пожалуйста, установите менеджер макета на RecyclerView как RecyclerView ниже:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

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

Ответ 13

Я боролся с этой проблемой в течение многих часов. Я использовал фрагмент. И проблема не возвращала 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;

Ответ 14

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

Удачного кодирования :-)

Ответ 15

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

Ответ 16

Если вы используете пользовательский адаптер, не забудьте установить ItemCount в размере вашей коллекции.

Ответ 17

В моем случае размер моего списка был 0, и он не вызывал onCreateViewHolder метод. Мне нужно было отобразить сообщение в центре для пустого списка в качестве заполнителя, чтобы я сделал это так, и он работал как шарм. Ответ @Константин Буров помог.

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}

Ответ 18

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

Ответ 19

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

Ответ 20

перейти к вашему XML. И измените свой макет, чтобы обернуть содержимое. Один элемент скрывает следующий, поэтому методы не работают!

Ответ 21

Прошу сделать следующее:

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

Ответ 22

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

Ответ 23

Моей ошибкой было надувание неверного представления во Fragment onCreateView.

Ответ 24

Для меня это было потому, что setHasStableIds (true); метод был установлен. Удалите это, и это будет работать

Ответ 25

Я действительно очень надеюсь, что это поможет кому-нибудь когда-нибудь. Я просто потратил больше часа на этот сумасшедший!

У меня было это:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

Когда я должен был иметь это:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

Поскольку я по глупости назвал свой адаптер adapter, он был затенен адаптером представления переработчика в блоке применения! Я переименовал адаптер в projectAdapter, чтобы выделить его, и проблема решена!

Ответ 26

recyclerView.setAdapter (адаптер); Вызванный список recyclerView заполняется путем вызова метода.