0

I'm trying to make a fragment (GiornataFragment (DayFragment)) that contains a ViewPager2 element linked to a TabLayout.

Inside the pages of ViewPager2 I would like to insert another fragment (PartitaFragment (MatchesFragment)) that contains only a recyclerview that loads data remotely.

I tried to load an instance of PartitaFragment separately (by StartActivity) and everything went good. GiornataFragment is used to remotely load some data that are used to calculate the number of PartitaFragment to be added to viewPager2.

However when I try to load PartitaFragment inside the ViewPager2 of GiornataFragment, nothing is displayed.

Through various Log I have verified that the loading of the data works, but it seems that onCreateViewHolder of PartitaAdapter does not start.

I ask you for help!

PartiteFragment GiornataFragment

I attach code

fragment_partita.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".ui.squadre.PartiteFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"/>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rvPartitaList"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:listitem="@layout/partita_row" />

    </LinearLayout>
</layout>

PartitaFragment.java

package it.g.teams.ui.partita;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.LinearLayoutManager;

import java.util.ArrayList;
import java.util.List;

import it.g.teams.R;
import it.g.teams.adapters.PartitaAdapter;
import it.g.teams.commons.TeamsApplication;
import it.g.teams.databinding.FragmentPartitaBinding;
import it.g.teams.pojos.PartitaJSON;

public class PartiteFragment extends Fragment {

    public static final String ARG_OBJECT = "p_frag";
    private final String TAG = getClass().getSimpleName();
    private FragmentPartitaBinding binding;
    private int giornata;
    private PartitaAdapter adapter;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_partita, container, false);
        
        if(savedInstanceState == null) {
            initGiornata();
            initRecyclerView();

            if (TeamsApplication.getInstance().isNetworkAvailable()) {
                binding.progressBar.setVisibility(View.VISIBLE);

                PartiteViewModel partiteViewModel = new PartiteViewModel();
                partiteViewModel.getPartite(giornata).observe(getActivity(), new Observer<List<PartitaJSON>>() {
                    @Override
                    public void onChanged(List<PartitaJSON> partitaList) {
                        if (partitaList != null && !partitaList.isEmpty()) {
                            binding.progressBar.setVisibility(View.GONE);
                            adapter.setPartitaList(partitaList);
                            adapter.notifyDataSetChanged();
                            Log.e(TAG, "partitaList reciclerV=" + ((PartitaAdapter)binding.rvPartitaList.getAdapter()).getPartitaList().size());
                        }
                    }
                });

            } else {
                Toast.makeText(getActivity(), "Collegamento alla rete  non disponibile", Toast.LENGTH_LONG).show();
            }
        } else {
            ArrayList<PartitaJSON> partiteList = (ArrayList<PartitaJSON>)savedInstanceState.getSerializable(PartiteFragment.ARG_OBJECT);
            reinitRecyclerView(partiteList);
        }

        return binding.getRoot();
    }

    private void initRecyclerView(){
        binding.rvPartitaList.setHasFixedSize(true);
        binding.rvPartitaList.setLayoutManager(new LinearLayoutManager(getActivity()));
        adapter = new PartitaAdapter();
        binding.rvPartitaList.setAdapter(adapter);
    }

    private void reinitRecyclerView(ArrayList<PartitaJSON> arrayList){
        binding.rvPartitaList.setHasFixedSize(true);
        binding.rvPartitaList.setLayoutManager(new LinearLayoutManager(getActivity()));
        adapter = new PartitaAdapter();
        adapter.setPartitaList(arrayList);
        binding.rvPartitaList.setAdapter(adapter);
    }

    private void initGiornata(){
        giornata = getArguments().getInt(PartiteFragment.ARG_OBJECT);
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // Salva i dati per il recycler
        ArrayList<PartitaJSON> squadraJSONList = new ArrayList<>(adapter.getPartitaList());
        savedInstanceState.putSerializable(PartiteFragment.ARG_OBJECT, squadraJSONList);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

}

PartitaAdapter.java

package it.g.teams.adapters;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

import it.g.teams.R;
import it.g.teams.databinding.PartitaRowBinding;
import it.g.teams.pojos.PartitaJSON;

public class PartitaAdapter extends RecyclerView.Adapter<PartitaAdapter.PartitaViewHolder> {

    private final String TAG = getClass().getSimpleName();

    private List<PartitaJSON> partitaList;

    public PartitaAdapter() {
        partitaList = new ArrayList<>();
    }

    public List<PartitaJSON> getPartitaList() {
        return partitaList;
    }

    public void setPartitaList(List<PartitaJSON> currencyList) {
        partitaList = currencyList;
    }

    @Override
    public int getItemCount() {
        return partitaList != null ? partitaList.size() : 0;
    }

    @NotNull
    @Override
    public PartitaViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
        Log.e(TAG, "PartitaViewHolder onCreateViewHolder");
        PartitaRowBinding binding = DataBindingUtil.inflate(
                LayoutInflater.from(parent.getContext()),
                R.layout.partita_row, parent, false);

        return new PartitaViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(PartitaViewHolder holder, final int position) {
        Log.e(TAG, "PartitaViewHolder onBindViewHolder " + position);
        Log.e(TAG, "imageUrlCasa " + partitaList.get(position).getUrlMediaCasa());
        Log.e(TAG, "imageUrlTrasferta " + partitaList.get(position).getUrlMediaTrasferta());

        holder.binding.setModel( partitaList.get(position) );
        holder.binding.partitaRowTouch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!partitaList.get(position).isBoisCasa() && !partitaList.get(position).isBoisTrasferta())
                    Toast.makeText(v.getContext(), R.string.no_altri_dati_partita, Toast.LENGTH_LONG).show();
                else {
                    Toast.makeText(v.getContext(), R.string.todo, Toast.LENGTH_LONG).show();
                }
            }
        });

    }

    static class PartitaViewHolder extends RecyclerView.ViewHolder {
        private PartitaRowBinding binding;

        PartitaViewHolder(PartitaRowBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
    }

}

fragment_giornata.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ui.giornata.GiornataFragment">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            >

        </androidx.viewpager2.widget.ViewPager2>
    </FrameLayout>

</layout>

GiornataFragment.java

package it.g.teams.ui.giornata;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.viewpager2.widget.ViewPager2;

import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import java.util.ArrayList;
import java.util.List;

import it.g.teams.R;
import it.g.teams.adapters.GiornataAdapter;
import it.g.teams.commons.TeamsApplication;
import it.g.teams.pojos.CampionatoJSON;
import it.g.teams.pojos.GiornataJSON;

public class GiornataFragment extends Fragment {
    /**
     * The fragment argument representing the item ID that this fragment
     * represents.
     */
    public static final String ARG_ITEM_ID = "gf_id";
    private final String TAG = getClass().getSimpleName();
    private ViewPager2 viewPager;
    private GiornataAdapter adapter;
    private int numeroGiornata;

    public GiornataFragment() {
    }

    public GiornataFragment(int numeroGiornata) {
        this.numeroGiornata = numeroGiornata;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View v = inflater.inflate(R.layout.fragment_giornata, container, false);

        Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
        toolbar.getMenu().clear();
        getActivity().getMenuInflater().inflate(R.menu.campionato_menu, toolbar.getMenu());

        adapter = new GiornataAdapter(this);
        viewPager = v.findViewById(R.id.pager);
        viewPager.setAdapter(adapter);
        TabLayout tabLayout = v.findViewById(R.id.tab_layout);
        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> tab.setText("" + adapter.getGiornataList().get(position).getNumeroGiornata())
        ).attach();
        
        if (savedInstanceState == null) {

            savedInstanceState = getArguments();
            CampionatoJSON campionato = (CampionatoJSON) savedInstanceState.getSerializable(GiornataFragment.ARG_ITEM_ID);

            if (TeamsApplication.getInstance().isNetworkAvailable()) {
                //binding.progressBar.setVisibility(View.VISIBLE);

                GiornataViewModel giornataViewModel = new GiornataViewModel();
                giornataViewModel.getPartite(campionato.getCodiceCampionato()).observe(getActivity(), new Observer<List<GiornataJSON>>() {
                    @Override
                    public void onChanged(List<GiornataJSON> giornataJSON) {
                        if (giornataJSON != null && !giornataJSON.isEmpty()) {
                            Log.e(TAG, "List<GiornataJSON>=" + giornataJSON.size());
                            //binding.progressBar.setVisibility(View.GONE);
                            adapter.setGiornataList(giornataJSON);
                            adapter.notifyDataSetChanged();
                            Log.e("GiornataAdapter.itemNum", "" + adapter.getItemCount());
                            Log.e("ViewPager.itemNum", "" + viewPager.getAdapter().getItemCount());
                        }
                    }
                });

            } else {
                Toast.makeText(getActivity(), "No Network Available", Toast.LENGTH_LONG).show();
            }
        } else {
            numeroGiornata = savedInstanceState.getInt("gg");
            ArrayList<GiornataJSON> giornataJSONList = (ArrayList<GiornataJSON>)savedInstanceState.getSerializable("campAdapt");
            adapter.setGiornataList(giornataJSONList);
        }
        return v;
    }

    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        //Log.e("created adapter.itemNum", "" + adapter.getItemCount());
        viewPager = getView().findViewById(R.id.pager);
        viewPager.setAdapter(adapter);
        TabLayout tabLayout = view.findViewById(R.id.tab_layout);
        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> tab.setText("" + adapter.getGiornataList().get(position).getNumeroGiornata())
        ).attach();

    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        TabLayout tabLayout = getView().findViewById(R.id.tab_layout);
        savedInstanceState.putInt("gg", tabLayout.getSelectedTabPosition());

        // Salva i dati per il recycler
        ArrayList<GiornataJSON> giornataJSONList = new ArrayList<>(adapter.getGiornataList());
        savedInstanceState.putSerializable(GiornataFragment.ARG_ITEM_ID, giornataJSONList);
    }
}

GiornataAdapter.java

package it.g.teams.adapters;

import android.os.Bundle;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import java.util.ArrayList;
import java.util.List;

import it.g.teams.pojos.GiornataJSON;
import it.g.teams.ui.partita.PartiteFragment;

public class GiornataAdapter extends FragmentStateAdapter {

    private final String TAG = getClass().getSimpleName();
    private List<GiornataJSON> giornataList;
    private List<PartiteFragment> partiteFragmentList;

    public GiornataAdapter(@NonNull Fragment parentFragment) {
        super(parentFragment);
        partiteFragmentList = new ArrayList<>();
    }

    public List<GiornataJSON> getGiornataList() {
        return giornataList;
    }

    public void setGiornataList(List<GiornataJSON> giornataList) {
        this.giornataList = giornataList;
    }

    @Override
    public Fragment createFragment(int i) {
        Log.i(TAG, " fragment " + i);
        PartiteFragment fragment = new PartiteFragment();
        Bundle args = new Bundle();
        // Our object is just an integer :-P
        args.putInt(PartiteFragment.ARG_OBJECT, giornataList.get(i).getCodiceGiornata());
        fragment.setArguments(args);
        Log.i(TAG, " fragment gg " + giornataList.get(i).getCodiceGiornata());
        partiteFragmentList.add(fragment);
        return fragment;
    }

    @Override
    public int getItemCount() {
        return giornataList != null ? giornataList.size() : 0;
    }

}
Giancarlo
  • 1
  • 1

0 Answers0