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;
}
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помогло.
Пожалуйста, установите 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;
Моим encouter был onBindViewHolder (держатель , позиция) переопределенный метод RecyclerView.адаптер не вызывается. Был вызван метод onCreateViewHolder, getItemCount. Если вы прочитаете спецификации для адаптера Recyclerview, вы узнаете,что если вы переопределили onBindViewHolder( держатель, позиция, список полезных нагрузок), он будет вызван в пользу. Поэтому, пожалуйста, будьте осторожны.
Если вы поместите wrap_content в качестве высоты вашего списка, а также высоты вашего списка элементов, ничего не будет отображаться, и ни одна из ваших функций recyclerView не будет вызвана. Зафиксируйте высоту элемента или поместите match_parent для высоты списка. Это решило мою проблему.
В моем случае после изменения действия на использование ViewModel и привязки данных я забыл удалить вызов метода
setContentViewиз методаonCreate. Удалив его, я решил свою проблему.
Возможно, это кому-то поможет, но если вы установите видимость RecycleView в GONE, методы адаптера вообще не будут вызываться... Мне потребовалось некоторое время, чтобы понять это.
Comments