ViewPager2 TabLayout片段不显示ViewPager2内部片段

时间:2020-06-02 10:46:05

标签: java android fragment android-tablayout android-viewpager2

我正在尝试制作一个片段(GiornataFragment(DayFragment)),其中包含一个链接到TabLayout的ViewPager2元素。

在ViewPager2的页面内部,我想插入另一个片段(PartitaFragment(MatchesFragment)),该片段仅包含一个可远程加载数据的recyclerview。

我试图单独加载PartitaFragment的一个实例(通过StartActivity),一切顺利。 GiornataFragment用于远程加载一些数据,这些数据用于计算要添加到viewPager2的PartitaFragment的数量。

但是,当我尝试在GiornataFragment的ViewPager2中加载PartitaFragment时,什么也没显示。

通过各种日志,我已经验证了数据加载的正常工作,但是看来PartitaAdapter的onCreateViewHolder无法启动。

我请求您的帮助!

PartiteFragment GiornataFragment

我附上代码

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

}

0 个答案:

没有答案