我正在尝试制作一个片段(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;
}
}