Fragment onResume mit Loader

  • Antworten:2
Herr. P.
  • Forum-Beiträge: 2

21.11.2013, 08:29:10 via Website

Hallo,

Ich habe ein Fragment (YearsFragment) mit einer Liste. Wenn ich ein Element der Liste anklick wird ein neues Fragment (EventsFragment) ausgeführt. Der Loader des neuen Fragments ladet eine neue Liste. Soweit so gut.

Wenn ich jetzt zurück auf das erste Fragement (YearsFragment) gehe und ich das selbe Element wieder anklicke ladet das EventsFragment die liste neu, jedoch würde ich gerne mit den alten schon geladenen Daten arbeiten.

EventsActivity:
1public class EventsActivity extends FragmentActivity implements YearsFragment.OnYearSelectedListener, EventsFragment.OnEventSelectedListener{
2
3private boolean screenSizeLarge;
4private EventsFragment eventFrag = null;
5
6@Override
7protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.years_events);
10
11 // Check whether the activity is using the layout version with the fragment_container FrameLayout (small Display).
12 if (findViewById(R.id.fragment_container) != null) {
13 screenSizeLarge = false; //one-pane
14
15 YearsFragment firstFragment = new YearsFragment();
16
17 firstFragment.setArguments(getIntent().getExtras());
18
19 // Add the fragment to the 'fragment_container' FrameLayout
20 getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();
21 }else{
22 screenSizeLarge = true; //two-pane
23 }
24}
25
26@Override
27public void onYearSelected(Years year) {
28 // The user selected the year from the YearsFragment
29
30 if (screenSizeLarge) {
31 // two-pane layout
32
33 // Capture the events fragment from the activity layout
34 eventFrag = (EventsFragment) getSupportFragmentManager().findFragmentById(R.id.event_fragment);
35
36 // Call a method in the EventFragment to update its content
37 eventFrag.updateEventsView(year);
38
39 } else {
40 //one-pane layout
41
42 if(eventFrag == null){
43 eventFrag = new EventsFragment();
44 }
45
46 Bundle args = new Bundle();
47 args.putInt("year", Integer.parseInt(year.getYear()));
48 eventFrag.setArguments(args);
49
50 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
51
52 // Replace whatever is in the fragment_container view with this fragment,
53 // and add the transaction to the back stack so the user can navigate back
54 transaction.replace(R.id.fragment_container, eventFrag);
55 transaction.addToBackStack(null);
56 // Commit the transaction
57 transaction.commit();
58 }
59}}

YearsFragment:
1public class YearsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<List<Years>>{
2YearsAdapter adapter;
3
4// The container Activity must implement this interface so the frag can deliver messages
5OnYearSelectedListener mCallback;
6public interface OnYearSelectedListener {
7 /** Called by YearsFragment when a list item is selected */
8 public void onYearSelected(Years year);
9}
10
11public void onActivityCreated(Bundle savedInstanceState) {
12 super.onActivityCreated(savedInstanceState);
13}
14
15
16@Override
17public void onResume() {
18 super.onResume();
19 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
20
21 adapter = new YearsAdapter(getActivity());
22 setListAdapter(adapter);
23
24 setEmptyText("No Data Here");
25 setListShown(false);
26
27 getLoaderManager().initLoader(0, null, this);
28}
29
30@Override
31public void onAttach(Activity activity){
32 super.onAttach(activity);
33
34 try{
35 mCallback = (OnYearSelectedListener) activity;
36 } catch (ClassCastException e){
37 throw new ClassCastException(activity.toString() +
38 "must implement OnYearSelectedListener");
39 }
40}
41
42@Override
43public void onListItemClick(ListView l, View v, int position, long id) {
44 mCallback.onYearSelected(adapter.getItem(position));
45}
46
47//implements Loader
48
49@Override
50public Loader<List<Years>> onCreateLoader(int arg0, Bundle arg1) {
51 Log.i("YearsFragment","YearsFragment.onCreateLoader");
52
53 return new YearsLoader(getActivity());
54}
55
56@Override
57public void onLoadFinished(Loader<List<Years>> arg0, List<Years> data) {
58 Log.i("YearsFragment","YearsFragment.onLoadFinished");
59
60 adapter.setData(data);
61
62 if(isResumed()){
63 setListShown(true);
64 }else{
65 setListShownNoAnimation(false);
66 }
67}
68
69@Override
70public void onLoaderReset(Loader<List<Years>> arg0) {
71 Log.i("YearsFragment","YearsFragment.onLoaderReset");
72
73 adapter.setData(null);
74}}

EventsFragment:
1public class EventsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<List<Events>>{
2EventsAdapter adapter;
3private int year;
4
5public EventsFragment(){
6 year = Calendar.getInstance().get(Calendar.YEAR);
7}
8
9// The container Activity must implement this interface so the frag can deliver messages
10OnEventSelectedListener mCallback;
11public interface OnEventSelectedListener {
12 /** Called by YearsFragment when a list item is selected */
13 public void onEventSelected(Events event);
14}
15
16public void onActivityCreated(Bundle savedInstanceState) {
17 super.onActivityCreated(savedInstanceState);
18 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
19
20 Log.i("EventsFragment","EventsFragment.onActivityCreated");
21
22 adapter = new EventsAdapter(getActivity());
23 setListAdapter(adapter);
24
25 setEmptyText("No Data Here");
26 setListShown(false);
27}
28
29@Override
30public void onResume() {
31 super.onResume();
32 Bundle args = this.getArguments();
33 if(args != null){
34 year = args.getInt("year");
35 }
36 updateEventsView(year);
37 // The activity has become visible (it is now "resumed").
38}
39
40@Override
41public void onAttach(Activity activity){
42 super.onAttach(activity);
43
44 try{
45 mCallback = (OnEventSelectedListener) activity;
46 } catch (ClassCastException e){
47 throw new ClassCastException(activity.toString() +
48 "must implement OnEventsSelectedListener");
49 }
50}
51
52@Override
53public void onListItemClick(ListView l, View v, int position, long id) {
54 mCallback.onEventSelected(adapter.getItem(position));
55}
56
57public void updateEventsView(Years year) {
58 this.year = Integer.parseInt(year.getYear());
59 getLoaderManager().initLoader(this.year, null, this);
60}
61
62public void updateEventsView(int year) {
63 this.year = year;
64 getLoaderManager().initLoader(this.year, null, this);
65}
66
67//Loader
68@Override
69public Loader<List<Events>> onCreateLoader(int arg0, Bundle arg1) {
70 Log.i("EventsFragment","EventsFragment.onCreateLoader");
71
72 return new EventsLoader(getActivity(),this.year);
73}
74
75@Override
76public void onLoadFinished(Loader<List<Events>> arg0, List<Events> data) {
77 Log.i("EventsFragment","EventsFragment.onLoadFinished");
78
79 adapter.setData(data);
80
81 if(isResumed()){
82 setListShown(true);
83 }else{
84 setListShownNoAnimation(false);
85 }
86}
87
88@Override
89public void onLoaderReset(Loader<List<Events>> arg0) {
90 Log.i("EventsFragment","EventsFragment.onLoaderReset");
91
92 adapter.setData(null);
93} }

Wie soll ich das mit onResume angehen?

LG, Herr. P.

Antworten
Appsoluts
  • Forum-Beiträge: 304

24.11.2013, 05:35:07 via Website

Also erst einmal ist deine Umsetzung mit Fragments und Bundles sehr fragwürdig.
Je nach Gerät wird dies eine exception schmeißen und abstürtzen.

Benutz lieber den newInstance Konstruktor in der FragmentKlasse. Alles andere ist nicht gut.

Ich würde auch an deiner Stelle die Logik von der UI trennen.

Bau dir ne Klasse, welche alle logischen methoden beinhaltet, du kannst auch Variablen zum speichern dort bereitstellen und diese bei erneuter Ausführung aufrufen, anstatt die ganze Logik.

Ich stell mir jetzt mal vor, ich habe ein Fragment was Medikamente von einer API aufruft und das bei jedem Start des Fragments.

Lad die Medikamente einmal, speicher sie in einer DB oder lokalen Variable und beim erneuten Aufruf des Fragments benutz die schon gespeicherten Daten.

Gruß

Herr. P.

Antworten
Herr. P.
  • Forum-Beiträge: 2

24.11.2013, 11:51:39 via Website

Danke,

ich werde es dann gleich mal so umbauen und ausprobieren.

LG, Herr. P.

Antworten