Ho un frammento che contiene un RecyclerView per visualizzare gli eventi per un determinato giorno. Sto usando un ViewPager per separare i Frammenti in più giorni; Un frammento per gli eventi di sabato e un frammento per gli eventi della domenica.I frammenti ViewPager fanno tutti riferimento allo stesso RecyclerView e/o Adattatore
Tuttavia, sembra che entrambi i frammenti facciano riferimento allo stesso RecyclerView e/o adattatore, poiché è solo l'ultima scheda (in questo caso, domenica) i cui eventi vengono visualizzati.
Nel mio caso specifico, il sabato ha due eventi e la domenica non ha eventi. Entrambi i frammenti hanno vuote RecyclerViews. Per confermare la mia teoria che è stata causata dall'ultima scheda, ho cambiato la data. Ciò ha causato a RecyclerViews due eventi (quelli di sabato).
Ecco il codice rilevante per i singoli frammenti:
public class EventListFragment extends Fragment{
private EventAdapter mEventAdapter;
private static final String DATE_ARG = "eventDate";
public static EventListFragment newInstance(LocalDate date){
EventListFragment eventListFragment = new EventListFragment();
Bundle args = new Bundle();
args.putSerializable(DATE_ARG, date);
eventListFragment.setArguments(args);
return eventListFragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_event_list, container, false);
// Setup recyclerview
RecyclerView eventRecyclerView = (RecyclerView) view.findViewById(R.id.event_recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
eventRecyclerView.setLayoutManager(layoutManager);
// Get date
LocalDate eventDate = (LocalDate) getArguments().getSerializable(DATE_ARG);
// Set adapter
mEventAdapter = new EventAdapter(getActivity(), getEvents(eventDate));
eventRecyclerView.setAdapter(mEventAdapter);
return view;
}
}
getEvents()
è solo una funzione privata per restituire gli eventi per una determinata data. Ho usato il debugger così come i test unitari per verificare che funzioni correttamente. Il debugger mostra che tira l'elenco corretto per ciascun frammento, ma come ho spiegato non vengono visualizzati correttamente.
ecco il codice rilevante per il frammento genitore:
public class EventFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_event, container, false);
// Get and set up viewpager
final ViewPager viewPager = (ViewPager) view.findViewById(R.id.event_view_pager);
EventFragmentAdapter eventFragmentAdapter = new EventFragmentAdapter(getFragmentManager(), getEventDates());
viewPager.setAdapter(eventFragmentAdapter);
// Get and set up tablayout
final TabLayout tabLayout = (TabLayout) view.findViewById(R.id.event_tabs);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
return view;
}
}
Simile a quello ultimo, getEventDates()
tira solo le date che gli eventi sono in corso. A scopo di test al momento, sto codificando con difficoltà un elenco di date restituito poiché non abbiamo ancora impostato il nostro database. Ho tirato questo metodo fuori perché voglio l'applicazione per essere in grado di funzionare di nuovo nel 2016, che può avere diverse date:
private List<LocalDate> getEventDates(){
List<LocalDate> eventDates = new ArrayList<>();
eventDates.add(new LocalDate(2015, 10, 17));
eventDates.add(new LocalDate(2015, 10, 18));
return eventDates;
}
L'ultimo pezzo di codice di riferimento è per la FragmentStatePagerAdapter sto usando per la mia ViewPager:
public class EventFragmentAdapter extends FragmentStatePagerAdapter {
private List<LocalDate> mEventDates;
public EventFragmentAdapter(FragmentManager fragmentManager, List<LocalDate> eventDates){
super(fragmentManager);
this.mEventDates = eventDates;
}
@Override
public Fragment getItem(int i) {
return EventListFragment.newInstance(mEventDates.get(i));
}
@Override
public int getCount() {
return mEventDates.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mEventDates.get(position).dayOfWeek().getAsText();
}
}
Qualche idea sul perché entrambi gli elenchi siano sempre gli stessi e si basino sull'ultima scheda del ViewPager? Suppongo che in qualche modo stiano facendo riferimento allo stesso RecyclerView o allo stesso RecyclerViewAdapter, ma non ho campi statici per quelli quindi non sono sicuro di come stia accadendo.
tutto sembra giusto. Potresti mostrarci il tuo codice getEventDates? –
Sei sicuro che 'getEvents()' non sta restituendo lo stesso set di dati di ogni 'LocalDate'? Come piccolo test, cosa succede se si sposta il 'ViewPager' su' Activity'? – Blackbelt
@RodrigoHenriques a scopo di test in questo momento, ho appena hardcoded le date che ho restituito. Ritorna un oggetto 'List' che ha date 2015-10-17 e 2015-10-18. Sto ancora lavorando su un modo per estrarre questi eventi da un database in seguito, quindi l'app si applicherà ancora al nostro evento nel 2016. Ma è tutto ciò che fa è restituire queste due date. –
AdamMc331