Я новичок в студии Android. Я пытаюсь отобразить элементы в RecycleView, но ничего не показывает.
Вот что говорит студия Android:
E/RecyclerView: No layout manager attached; skipping layout
Мой Фрагмент:
public class Articles extends Fragment {
View root;
RecyclerView recyclerView;
NewsList[] myListData = new NewsList[] {
new NewsList("Article 1", "Some Author"),
new NewsList("Article2", "Some Author"),
new NewsList("Article3", "Some Author"),
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
root = inflater.inflate(R.layout.fragment_articles, container, false);
recyclerView = root.findViewById(R.id.recyclerView);
NewsAdapter adapter = new NewsAdapter(myListData);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
return root;
}
Вот код моего класса адаптера:
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
private NewsList[] listdata;
// RecyclerView recyclerView;
public NewsAdapter(NewsList[] listdata) {
this.listdata = listdata;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItem= layoutInflater.inflate(R.layout.list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(listItem);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final NewsList myListData = listdata[position];
holder.textView1.setText(listdata[position].getTitle());
holder.textView2.setText(listdata[position].getAuthor());
holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(),"click on item: "+myListData.getTitle(),Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return listdata.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView textView1;
public TextView textView2;
public RelativeLayout relativeLayout;
public ViewHolder(View itemView) {
super(itemView);
this.textView1 = (TextView) itemView.findViewById(R.id.textView1);
this.textView2 = (TextView) itemView.findViewById(R.id.textView2);
relativeLayout = (RelativeLayout)itemView.findViewById(R.id.relativeLayout);
}
}
Раньше у меня была ошибка, когда приложение вылетало при открытии фрагмента, но теперь оно пропускает RecyclerView. Буду признателен, если вы поможете мне решить этот вопрос.
Вам нужно добавить layoutManager к вашему виду переработчика:
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
root = inflater.inflate(R.layout.fragment_articles, container, false);
recyclerView = root.findViewById(R.id.recyclerView);
NewsAdapter adapter = new NewsAdapter(myListData);
recyclerView.setHasFixedSize(true);
// Add this line
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()))
recyclerView.setAdapter(adapter);
return root;
}
Спасибо за ответ! Это сработало. Я знал, что мне нужен LinearLayoutManager, но я не знал, как его использовать в моем случае, так как я новичок в студии Android. Спасибо за помощь. :)
Вам всегда нужно будет установить менеджер компоновки для представления ресайклера при его инициализации. Существуют различные типы менеджеров макетов в зависимости от типа макета, который вам нужно установить для вашего списка. LinearLayoutManager — самый простой из них. Для получения дополнительной информации см. developer.android.com/guide/topics/ui/layout/recyclerview
Обязательно наличие менеджера компоновки для вашего Recyclerview. Например, вы можете использовать линейный, добавив это после раздувания вашего представления:
recyclerView.setLayoutManager(new LinearLayoutManager( context ));
Где контекст - это ваш контекст
Я попробовал этот метод, и он сказал, что это неправильный контекст, поэтому я попробовал метод Луки Пиццини. Все равно спасибо за помощь :)!
Плохо, контекст здесь должен быть getActivity(), а не «этот». Я программирую на Котлине, так что это не совсем то же самое, но вчера я столкнулся именно с этой проблемой.
Отвечает ли это на ваш вопрос? recyclerview Адаптер не подключен; пропуская макет