Autore Topic: ViewPager + PagerAdapter + CursorLoader  (Letto 1567 volte)

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
ViewPager + PagerAdapter + CursorLoader
« il: 10 Novembre 2012, 19:40:02 CET »
0
Un saluto a tutti!
Premetto che programmo per hobby e pertanto non sono esperto in tutti i sensi (Java, Android,...). Chiedo quindi gentilmente aiuto e soprattutto pazienza a chi è più esperto. (vedi firma  :-P )

Venendo al mio problema, mi ritrovo ad avere un'Activity in NAVIGATION_MODE_TABS con 7 tabs. In ogni tab visualizzo un fragment che contiene una listView popolata dal CursorLoader relativo allo specifico fragment, sostanzialmente in per ogni tab ho una query diversa che popola la listView.

Attualmente quello che vorrei fare è aggiungere lo swiping laterale tra le tabs. Ho scandagliato la documentazione ufficiale e l'intero web, fatto mille prove senza arrivare ad una solida soluzione (il massimo che ho ottenuto è un'app che non crashasse ma che swipando ogni tab non conteneva i dati relativi alla stessa ma quelli di una delle altre tab a random).
Credo che nei miei tentavi ci sia qualche lacuna di fondo (Java? Fragment?).

Ad ogni modo oltre ad implementare lo swipe vorrei risolvere qualche dubbio che mi si è venuto durante i miei tentativi.
1) Per ciò che intendo fare sono proprio necessari i fragments? Di fatto le pagine avrebbero tutte lo stesso layout ma popolate da query diverse.
2) Che differenza c'è tra creare un'istanza di un fragment attraverso il suo costruttore ( new MyFragment()) piuttosto che attraverso il metodo Fragment.instantiate(Context, String)?

Meglio postare un po' di codice a questo punto.

Activity con tabs
Codice (Java): [Seleziona]
public class WeekActivity extends Activity {
        // private static final String TAG = "WeekActivity"; // For debugging

        ActionBar actionBar;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                // setContentView(R.layout.activity_week);
                actionBar = getActionBar();
                actionBar.setDisplayHomeAsUpEnabled(true);
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
                actionBar.setDisplayShowTitleEnabled(false);

                Tab tab_mon = actionBar.newTab();
                tab_mon.setText(R.string.monday);
                tab_mon.setTabListener(new TabListener<DayFragment>(this, "0",
                                DayFragment.class));
                actionBar.addTab(tab_mon);

                Tab tab_tue = actionBar.newTab();
                tab_tue.setText(R.string.tuesday);
                tab_tue.setTabListener(new TabListener<DayFragment>(this, "1",
                                DayFragment.class));
                actionBar.addTab(tab_tue);

                Tab tab_wed = actionBar.newTab();
                tab_wed.setText(R.string.wednesday);
                tab_wed.setTabListener(new TabListener<DayFragment>(this, "2",
                                DayFragment.class));
                actionBar.addTab(tab_wed);

                Tab tab_thu = actionBar.newTab();
                tab_thu.setText(R.string.thursday);
                tab_thu.setTabListener(new TabListener<DayFragment>(this, "3",
                                DayFragment.class));
                actionBar.addTab(tab_thu);

                Tab tab_fri = actionBar.newTab();
                tab_fri.setText(R.string.friday);
                tab_fri.setTabListener(new TabListener<DayFragment>(this, "4",
                                DayFragment.class));
                actionBar.addTab(tab_fri);

                Tab tab_sat = actionBar.newTab();
                tab_sat.setText(R.string.saturday);
                tab_sat.setTabListener(new TabListener<DayFragment>(this, "5",
                                DayFragment.class));
                actionBar.addTab(tab_sat);

                Tab tab_sun = actionBar.newTab();
                tab_sun.setText(R.string.sunday);
                tab_sun.setTabListener(new TabListener<DayFragment>(this, "6",
                                DayFragment.class));
                actionBar.addTab(tab_sun);
        }

        // ///////// Menu stuff ///////////
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.activity_events, menu);
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                        startActivity(new Intent(this, ChooserActivity.class)
                                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
                        return true;
                case R.id.add_event:
                        startActivity(new Intent(this, CreateWeeklyEventActivity.class)
                                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
                        return true;
                }

                return false;
        }

        // ////////// TabListener stuff ////////////
        public static class TabListener<T extends Fragment> implements
                        ActionBar.TabListener {
                private Fragment mFragment;
                private final Activity mActivity;
                private final String mTag;
                private final Class<T> mClass;

                /**
                 * Constructor used each time a new tab is created.
                 *
                 * @param activity
                 *            The host Activity, used to instantiate the fragment
                 * @param tag
                 *            The identifier tag for the fragment
                 * @param clz
                 *            The fragment's Class, used to instantiate the fragment
                 */

                public TabListener(Activity activity, String tag, Class<T> clz) {
                        mActivity = activity;
                        mTag = tag;
                        mClass = clz;
                }

                /* The following are each of the ActionBar.TabListener callback */

                public void onTabSelected(Tab tab, FragmentTransaction ft) {
                        // Check if the fragment is already initialized
                        if (mFragment == null) {
                                // If not, instantiate and add it to the activity
                                mFragment = Fragment.instantiate(mActivity, mClass.getName());
                                ft.add(android.R.id.content, mFragment, mTag);
                        } else {
                                // If it exists, simply attach it in order to show it
                                ft.attach(mFragment);
                        }
                }

                public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                        if (mFragment != null) {
                                // Detach the fragment, because another one is being attached
                                ft.detach(mFragment);
                        }
                }

                public void onTabReselected(Tab tab, FragmentTransaction ft) {
                        // User selected the already selected tab. Usually do nothing.
                }
        }
}

Fragment per le tabs.
Codice (Java): [Seleziona]
public class DayFragment extends Fragment implements
                LoaderManager.LoaderCallbacks<Cursor>, MultiChoiceModeListener,
                OnItemClickListener {
        private static final String TAG = "DayFragment"; // For debugging

        ListView list_events;
        SimpleCursorAdapter adapter;
        int day;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.d(TAG, "onCreate called");
                day = Integer.parseInt(getTag());
//              day = getArguments().getInt("day");
                Log.d(TAG, "fragment day: " + day);
                getLoaderManager()
                                .initLoader(day, null, (LoaderCallbacks<Cursor>) this);
                adapter = new SimpleCursorAdapter(getActivity(), // add the audio mode
                                                                                                                        // icon!
                                R.layout.row_weekly_event, null, new String[] {
                                                EventsProvider.C_TITLE, EventsProvider.C_NOTE,
                                                EventsProvider.C_START_TIME_HOUR,
                                                EventsProvider.C_START_TIME_MINUTE,
                                                EventsProvider.C_END_TIME_HOUR,
                                                EventsProvider.C_END_TIME_MINUTE }, new int[] {
                                                R.id.title, R.id.note, R.id.hour_start_time,
                                                R.id.minute_start_time, R.id.hour_end_time,
                                                R.id.minute_end_time }, 0);
        }

        // Associate a layout
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                if(container==null)
                        return null;
                return inflater.inflate(R.layout.activity_events, container, false);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                list_events = (ListView) getActivity().findViewById(R.id.list_events);
                list_events.setAdapter(adapter);
                list_events.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
                list_events.setMultiChoiceModeListener(this);
                list_events.setOnItemClickListener(this);
        }

        // ////////// Loader callback
        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
                Log.d(TAG, "onCreateLoader called with args: " + id);
                switch (id) {
                case 0:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.MONDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 1:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.TUESDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 2:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null,
                                        EventsProvider.C_REPEAT_ON + "=" + Calendar.WEDNESDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 3:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.THURSDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 4:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.FRIDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 5:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.SATURDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 6:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.SUNDAY,
                                        null, EventsProvider.C_ID + " DESC");
                }
                return null;
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
                Log.d(TAG, "onLoadFinished called");
                adapter.swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
                Log.d(TAG, "onLoaderReset called");
                adapter.swapCursor(null);
        }

        // /////////// ActionMode callback /////////////
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // Inflate the menu for the CAB
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.events_action_mode, menu);
                return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
        }

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position,
                        long id, boolean checked) {
                mode.setSubtitle(Integer.toString(list_events.getCheckedItemCount())
                                + " " + getString(R.string.selected));
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                switch (item.getItemId()) {
                case R.id.action_mode_delete:
                        deleteSelectedItems();
                        mode.finish();
                        return true;
                }
                return false;
        }

        private void deleteSelectedItems() {
                long[] idToDelete = list_events.getCheckedItemIds();
                String selection = EventsProvider.C_ID + "=? ";
                String[] selectionArgs = new String[idToDelete.length];
                for (int i = 0; i < idToDelete.length; i++) {
                        if (i > 0) {
                                selection += "OR " + EventsProvider.C_ID + "= ? ";
                        }
                        selectionArgs[i] = Long.toString(idToDelete[i]);
                }
                getActivity().getContentResolver().delete(EventsProvider.URI_T_WEEK,
                                selection, selectionArgs);
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
        }

        // ////////// onItemClick callback ////////////
        @Override
        public void onItemClick(AdapterView<?> adapter, View v, int position,
                        long id) {
                Intent intent = new Intent(getActivity(),
                                CreateWeeklyEventActivity.class);
                intent.putExtra("id", id);
                startActivity(intent);
        }
}

Chiedo venia a chiunque inorridisca alla vista del mio codice. :-P

Grazie anticipatamente!

Edit: ah dimenticavo ho guardato il tutorial relativo al ViewPager ma non mi ha aiutato riguardo la questione CursorLoader.
« Ultima modifica: 10 Novembre 2012, 20:30:52 CET da gionew »
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #1 il: 11 Novembre 2012, 16:08:41 CET »
0
Okey, ho riprovato (prendendo spunto da altre risposte in altri forum) per l'ennesima volta e arrivo al solito risultato, in cui l'associazione tab-contenuto non quadra per niente. Però lo swipe funziona.

Activity con ViewPager e PagerAdapter:
Codice (Java): [Seleziona]
package com.bord.shutup;

import java.util.ArrayList;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.ViewGroup;

public class TestWeekActivity extends FragmentActivity implements TabListener {

        private static final String TAG = "TestWeekActivity";

        ActionBar mActionBar;
        SectionsPagerAdapter mSectionsPagerAdapter;
        ViewPager mViewPager;
        ArrayList<Fragment> fragments;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_week);
                mActionBar = getActionBar();
                mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

                // create the Fragment list
                fragments = new ArrayList<Fragment>();
                for (int i = 0; i < 7; i++) {
                        Bundle args = new Bundle();
                        args.putInt("day", i);
                        Fragment f = DayFragment.newInstance(this);
                        f.setArguments(args);
                        fragments.add(f);
                }

                mSectionsPagerAdapter = new SectionsPagerAdapter(
                                getSupportFragmentManager(), fragments, getResources()
                                                .getStringArray(R.array.day_of_week));

                mViewPager = (ViewPager) findViewById(R.id.pager);
                mViewPager.setAdapter(mSectionsPagerAdapter);
                mViewPager
                                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                                        @Override
                                        public void onPageSelected(int position) {
                                                mActionBar.setSelectedNavigationItem(position);
                                        }
                                });

                for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
                        mActionBar.addTab(mActionBar.newTab()
                                        .setText(mSectionsPagerAdapter.getPageTitle(i))
                                        .setTabListener(this));
                }
        }

        // ///////// TabListener stuff ////////
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
                mViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        }

        public class SectionsPagerAdapter extends FragmentPagerAdapter {

                private ArrayList<Fragment> fragments;
                private String[] titles;

                public SectionsPagerAdapter(FragmentManager fm,
                                ArrayList<Fragment> fragments, String[] titles) {
                        super(fm);
                        this.fragments = fragments;
                        this.titles = titles;
                }

                @Override
                public Fragment getItem(int i) {
                        Log.d(TAG, "getItem called " + i);
                        return fragments.get(i);
                }

                @Override
                public int getCount() {
                        return fragments.size();
                }

                @Override
                public CharSequence getPageTitle(int position) {
                        return titles[position];
                }

        }

}

Fragment con cui popolo il ViewPager:
Codice (Java): [Seleziona]
public class DayFragment extends Fragment implements
                LoaderManager.LoaderCallbacks<Cursor>, MultiChoiceModeListener,
                OnItemClickListener {
        private static final String TAG = "DayFragment"; // For debugging

        ListView list_events;
        SimpleCursorAdapter adapter;
        private int day;

        public static Fragment newInstance(Context context) {
                DayFragment f = new DayFragment();
                return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.d(TAG, "onCreate called");
                // day = Integer.parseInt(getTag());
                day = getArguments().getInt("day");
                Log.d(TAG, "fragment day: " + day);
                adapter = new SimpleCursorAdapter(getActivity(), // add the audio mode
                                                                                                                        // icon!
                                R.layout.row_weekly_event, null, new String[] {
                                                EventsProvider.C_TITLE, EventsProvider.C_NOTE,
                                                EventsProvider.C_START_TIME_HOUR,
                                                EventsProvider.C_START_TIME_MINUTE,
                                                EventsProvider.C_END_TIME_HOUR,
                                                EventsProvider.C_END_TIME_MINUTE }, new int[] {
                                                R.id.title, R.id.note, R.id.hour_start_time,
                                                R.id.minute_start_time, R.id.hour_end_time,
                                                R.id.minute_end_time }, 0);
        }

        // Associate a layout
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                Log.d(TAG, "onCreateView called " + day);
                return inflater.inflate(R.layout.activity_events, container, false);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                Log.d(TAG, "onActivityCreated called " + day);
                        Log.d(TAG, "set adapter " + day);
                        list_events = (ListView) getActivity().findViewById(
                                        R.id.list_events);
                        list_events.setAdapter(adapter);
                        list_events.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
                        list_events.setMultiChoiceModeListener(this);
                        list_events.setOnItemClickListener(this);
                getLoaderManager().initLoader(day, null, this);
        }

        // ////////// Loader callback
        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
                Log.d(TAG, "onCreateLoader called with args: " + id);
                switch (id) {
                case 0:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.MONDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 1:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.TUESDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 2:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null,
                                        EventsProvider.C_REPEAT_ON + "=" + Calendar.WEDNESDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 3:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.THURSDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 4:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.FRIDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 5:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.SATURDAY,
                                        null, EventsProvider.C_ID + " DESC");
                case 6:
                        return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK,
                                        null, EventsProvider.C_REPEAT_ON + "=" + Calendar.SUNDAY,
                                        null, EventsProvider.C_ID + " DESC");
                }
                return null;
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
                Log.d(TAG, "onLoadFinished called");
                adapter.swapCursor(cursor);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
                Log.d(TAG, "onLoaderReset called");
                adapter.swapCursor(null);
        }

        // /////////// ActionMode callback /////////////
        ...........
        .......
}

Mettendo i log nei metodi del FragmentPagerAdapter si vede che il metodo getItem(int) viene chiamato sia per la tab corrente che per quella adiacente e questo ha senso perchè così l'utente swippa e si trova già pronta la pagina ma temo che per come è scritto il fragment questo comportamento porti proprio al problema di disassociazione tra tab e loro contenuto...come fare quindi? Forse mi serve qualcosa che dalla Activity dica a ciascun fragment se deve essere visibile o meno in questo modo potrei mettere un if nell'onCreateView dei fragment e ritornare solo se il tal fragment deve essere visibile (se la relativa tab è selezionata o meno).

Non so più dove sbattere la testa.  :-(
« Ultima modifica: 11 Novembre 2012, 16:28:16 CET da gionew »
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #2 il: 11 Novembre 2012, 16:41:32 CET »
0
Hai provato a spostare l'inizializzazione del loader dall'onActivityCreated all''onCreateView del fragment?

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #3 il: 11 Novembre 2012, 16:52:46 CET »
0
Prima di tutto grazie della risposta.  :-)

Ho provato, stesso risultato.  :-(

Leggendo qui mi pare di aver capito che potrei risolvere usando un interfaccia implementata nella classe del Fragment ed usata poi nell'activity all'interno dell'onPageSelected per segnalare al fragment che la sua tab è selezionata.
Ma non capisco come fare ad inserire questa interfaccia. E non so se questo risolva il problema.
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #4 il: 11 Novembre 2012, 17:07:01 CET »
0
Questo che vorrei capire è:

Se tu ad esempio nell'onStart del fragment metti una cosa del genere:

Codice (Java): [Seleziona]
@Override
public void onStart() {
    super.onStart();
    int day = getArguments().getInt("day");
    Toast.makeText(getActivity(), "Day: " + day , Toast.LENGTH_SHORT).show();
}

Quando poi vai sul fragment (tramite swipe oppure selezionando la tab), il giorno è corretto o è sballato?
Se è corretto allora il problema è dovuto al caricamento dei dati altrimenti è altrove.

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #5 il: 11 Novembre 2012, 17:15:25 CET »
0
Questo che vorrei capire è:

Se tu ad esempio nell'onStart del fragment metti una cosa del genere:

Codice (Java): [Seleziona]
@Override
public void onStart() {
    super.onStart();
    int day = getArguments().getInt("day");
    Toast.makeText(getActivity(), "Day: " + day , Toast.LENGTH_SHORT).show();
}

Quando poi vai sul fragment (tramite swipe oppure selezionando la tab), il giorno è corretto o è sballato?
Se è corretto allora il problema è dovuto al caricamento dei dati altrimenti è altrove.

Allora, appena avvio l'activity è attiva la prima tab che però mostra il toast "Day: 0" (giusto) e subito dopo senza che si cambi tab compare "Day: 1" (sbagliato). Così poi se passo dalla tab 0 alla 1 mi mostra "Day: 2" (sbagliato) e così via. Appare sempre il toast del successivo o precedente.

Quindi il problema non può essere nel caricamento dati giusto?
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #6 il: 11 Novembre 2012, 17:21:42 CET »
0
Ok sapevo che il ViewPager pre-carica il fragment a destra di quello attualmente visualizzato ma non immaginavo che venisse chiamato anche l'onStart.
Comunque, per quanto riguarda i dati che mostra, di preciso qual'è l'errore di visualizzazione?
Potresti mettere un log dentro l'onCreateLoader per capire come questo viene chiamato?

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #7 il: 11 Novembre 2012, 17:33:03 CET »
0
Praticamente sulla tab 0 mi mostra i dati della tab 1, poi se mi muovo sulla tab 1 mi mostra quelli della tab 2, e se dalla tab2 torno indietro alla tab1 mi mostra quelli della tab0  ???

Nell'onCreateLoader ho piazzato il log che mi dice anche con quale day viene chiamato. La sequenza con cui viene chiamato è la stessa con cui viene visualizzato il toast che è ance la stessa con cui vengono mostrati i dati (non so se era questo che volevi sapere).

Edit: Quello che è strano è che se creo un activity con il wizard di eclipse e seleziono swipe+tabs il risultato è un'activity molto simile alla mia ma con fragment dichiarati con una classe statica mentre la mia non è statica...
« Ultima modifica: 11 Novembre 2012, 17:39:58 CET da gionew »
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #8 il: 11 Novembre 2012, 18:53:50 CET »
0
Dovrei costruirmi un progetto di prova per cercare di capire meglio il problema, appena ho tempo ci provo.
Nel frattempo, se risolvi, fammi sapere :)

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #9 il: 11 Novembre 2012, 19:05:21 CET »
0
Ti ringrazio molto!  ;-)
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #10 il: 22 Novembre 2012, 19:01:26 CET »
0
Niente da fare sono proprio in alto mare...ho provato di tutto, persino a scrivere un pageradpter custom ma il risultato è sempre una errata corrispondenza tra pagina e dati!  :-(

Any advice?
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline ilprofugo

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Next
  • Play Store ID:
    Fabrizio Consalvi
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #11 il: 14 Luglio 2013, 21:43:46 CEST »
0
Ciao, per caso hai rosolto il tuo problema? anche io ho un problema analogo e non so come rislverlo...

ciao
Fabrizio

Offline gionew

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, Nexus 7.
  • Sistema operativo:
    Ubuntu 12.04 (64bit)
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #12 il: 14 Luglio 2013, 23:33:45 CEST »
0
Ciao, per caso hai rosolto il tuo problema? anche io ho un problema analogo e non so come rislverlo...

ciao
Fabrizio

Ciao Fabrizio,
mi piacerebbe proprio aver risolto ma nulla...purtroppo sono anche dovuto stare lontano dal mio progetto per diverso tempo a causa dell'Università perciò non ho avuto tempo di fare tentativi ulteriori. Ricordo solo di aver tentato con soli due Fragment implementati con classi differenti e in tal modo riuscivo a rispettare la corrispondenza dati/pagina.

Tu che problemi hai incontrato? È molto simile al mio? (magari riusciamo ad attirare qualche anima pia che ci aiuti entrambi ;-))
Sono autodidatta a tempo perso e come tale non picchiatemi se dicessi cavolate. ;-)

Offline ilprofugo

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Next
  • Play Store ID:
    Fabrizio Consalvi
Re:ViewPager + PagerAdapter + CursorLoader
« Risposta #13 il: 25 Luglio 2013, 12:07:02 CEST »
0
Ciao, scusami pensavo di averti risposto ma non vedo la mia risposta quindi ti dico qual'era il mio problema e come l'ho risolto

Avevo anche io un'Activity in NAVIGATION_MODE_TABS con vari tabs. In ogni tab visualizzo un listfragment con le varie frasi di un film a cui ho associato degli mp3.

Ho implementato lo swipe, e quando ascoltavo gli mp3 mi prendeva quelli giusti, mentre quando mi creava il ContextMenu cliccando a lungo su un film mi caricava sempre l'mp3 del tab precedente o successivo.

Alla fine sono riuscito a farlo funzionare bene inserendo subito dopo l'onContextItemSelected questa condizione


Codice (Java): [Seleziona]
                if (getUserVisibleHint() == false) {
                        return false;
                }