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

#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 или что-то в этом роде. Поэтому старайтесь избегать этого, если вы можете использовать контекст.