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;
}
}