#android #android-fragments #android-recyclerview
#Android #android-фрагменты #android-recyclerview
Вопрос:
Я должен настроить вид переработки внутри фрагмента. Проблема в том, что когда я запускаю приложение, оно ничего не показывает, но если я переключусь на другой фрагмент и вернусь, все элементы будут там. Если я запущу приложение и попытаюсь прокрутить вид переработки, загрузятся первый элемент и последний. Я попытался найти ответ, но ничего полезного. Я упоминаю, что я только начал работать в Android Studio.
Это фрагмент кода
public class Main_fragment extends Fragment {
TextView titleText;
ArrayList<String> titles = new ArrayList<>();
// Access it from anywhere
static String FoodChoiceVar = "All food"; // Value set for test only. Maybe make an ENUM instead?
public Main_fragment() {
// Needed empty constructor.
}
// Don't edit this method as you won't be able tu use "R".
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
titles.add("Breakfast");titles.add("Morning Snack");titles.add("Lunch");titles.add("AfterNoon Snack");titles.add("Dinner"); titles.add("Night Snack");
}
//Use this instead.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_fragment, container, false);
final FragmentActivity c = getActivity();
titleText = view.findViewById(R.id.textViewFoodType);
titleText.setText(FoodChoiceVar "| MENU");
RecyclerView recyclerView = view.findViewById(R.id.fragmentRecycleView);
LinearLayoutManager layoutManager = new LinearLayoutManager(c);
recyclerView.setLayoutManager(layoutManager);
ViewAdapter adapter = new ViewAdapter(c,titles);
recyclerView.setHasFixedSize(false);
recyclerView.setAdapter(adapter);
return view;
}
ViewAdapter
public class ViewAdapter extends RecyclerView.Adapter<FoodMenuViewHolder> {
private LayoutInflater layoutInflater;
private List<String> titleData;
public ViewAdapter (Context context,List<String> titleData){
this.layoutInflater = LayoutInflater.from(context);
this.titleData = titleData;
}
@NonNull
@Override
public FoodMenuViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = layoutInflater.inflate(R.layout.layout_menu_item,viewGroup,false);
FoodMenuViewHolder holder = new FoodMenuViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull FoodMenuViewHolder foodMenuViewHolder, int i) {
String title = titleData.get(i);
foodMenuViewHolder.titleText.setText(title);
}
@Override
public int getItemCount() {
return titleData.size();
}
}
Держатель представления
public class FoodMenuViewHolder extends RecyclerView.ViewHolder {
public TextView titleText;
public FoodMenuViewHolder(@NonNull View itemView) {
super(itemView);
titleText = itemView.findViewById(R.id.ItemText);
}
}
Я снял 2 коротких видео, чтобы показать, что происходит
https://drive.google.com/file/d/17wvlhPUT5R0SN38C2TbgBv_AP8awQUI3/view?usp=sharing
https://drive.google.com/file/d/1LJ0Xg4p8Q4a4nyGPSHdVQhBlYOYYi1Pv/view?usp=sharing
Ответ №1:
Я думаю, что ваш адаптер теряет себя, поэтому попробуйте получить контекст для layout inflater из viewgroup в onCreateViewHolder.
это:
public FoodMenuViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new FoodMenuViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_menu_item, viewGroup, false);
}
И чтобы избежать ошибки, поместите execption в getItemCount().
Это:
@Override
public int getItemCount() {
if(titleData != null) {
return titleData.size();
} else {
return 0;
}
}
И попробуйте использовать контекст вместо активности фрагмента
final FragmentActivity c = getActivity();
Для
final Context c = getContext();
Комментарии:
1. Мне удалось исправить это, установив фиксированный dp для элементов в макете, используемом для представления переработки. Но я попробовал с помощью Context c = getContext(); и, похоже, сейчас это работает. Я снова пытаюсь протестировать его с помощью просмотра карты, чтобы убедиться, что он работает.
2. В Android мы обычно используем контекст для всего, только в очень конкретном случае вы будете использовать Activity, fragment или что-то в этом роде. Поэтому старайтесь избегать этого, если вы можете использовать контекст.