Autore Topic: Problema getItem su ViewPager  (Letto 640 volte)

Offline ilprofugo

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Next
  • Play Store ID:
    Fabrizio Consalvi
Problema getItem su ViewPager
« il: 12 Luglio 2013, 18:25:54 CEST »
0


Sto cercando di fare un app Tributo a Tomas Milian, l'ho implementata con le tab dell'action bar, praticamente un tab per ogni film, costituiti da una listfragment con le frasi dei film, dove cliccandoci sopra è possibile ascoltare l'mp3 associato alla frase stessa.
Ho implementato anche un context menu che premendo a lungo sulla frase mi permette di impostarla come suoneria o inviarla agli amici.

Se non implemento lo swipe tutto funziona alla perfezione, mentre quando sono andato a usare il viewpager seguendo la guida di google, lo swipe funziona e anche l'OnListItemClick mi permette di far suonare l'mp3 giusto, purtroppo invece il context menu mi salva l'mp3associato al tab precedente o successivo di quello selezionato.

Penso sia un problema dovuto al fatto che il viewpager  precarica i fragment adiacenti, avete idea di come posso risolvere?

Grazie
Fab


di seguito il codice dell'activity principale

Codice (Java): [Seleziona]
public class ProvaActivity extends SherlockFragmentActivity

        ActionBar actionBar;

        ViewPager mViewPager;
        TabsAdapter mTabsAdapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                mViewPager = new ViewPager(this);
                mViewPager.setId(R.id.pager);
                setContentView(mViewPager);

                // Getting an instance of action bar
                actionBar = getSupportActionBar();

                // Enabling Tab Navigation mode for this action bar
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

                // Enabling Title
                actionBar.setDisplayShowTitleEnabled(true);

                mTabsAdapter = new TabsAdapter(this, mViewPager);

                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.squadraantiscippo)
                                                .setIcon(R.drawable.squadraantiscippo),
                                SquadraAntiscippo.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.squadraantifurto)
                                                .setIcon(R.drawable.squadraantifurto),
                                SquadraAntifurto.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.squadraantitruffa)
                                                .setIcon(R.drawable.squadraantitruffa),
                                SquadraAntitruffa.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.squadraantimafia)
                                                .setIcon(R.drawable.squadraantimafia),
                                SquadraAntitruffa.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.squadraantigangsters)
                                                .setIcon(R.drawable.squadraantigangster),
                                SquadraAntigangsters.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.assassiniosultevere)
                                                .setIcon(R.drawable.assassiniosultevere),
                                AssassinioSulTevere.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.delittoaportaromana)
                                                .setIcon(R.drawable.delittoaportaromana),
                                DelittoAPortaRomana.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.delittoalristorantecinese)
                                                .setIcon(R.drawable.delittoalristorantecinese),
                                DelittoAlRistoranteCinese.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.delittosullautostrada)
                                                .setIcon(R.drawable.delittosullautostrada),
                                DelittoSullAutostrada.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.delittoinformulauno)
                                                .setIcon(R.drawable.delittoinformulauno),
                                DelittoInFormulaUno.class, null);
                mTabsAdapter.addTab(
                                actionBar.newTab().setText(R.string.delittoalbluegay)
                                                .setIcon(R.drawable.delittoalbluegay),
                                DelittoAlBlueGay.class, null);

                if (savedInstanceState != null) {
                        actionBar.setSelectedNavigationItem(savedInstanceState.getInt(
                                        "tab", 0));
                }
        }

        @Override
        protected void onSaveInstanceState(Bundle outState) {
                super.onSaveInstanceState(outState);
                outState.putInt("tab", getSupportActionBar()
                                .getSelectedNavigationIndex());
        }

        public static class TabsAdapter extends FragmentPagerAdapter implements
                        ActionBar.TabListener, ViewPager.OnPageChangeListener {
                private final Context mContext;
                private final ActionBar mActionBar;
                private final ViewPager mViewPager;
                private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

                static final class TabInfo {
                        private final Class<?> clss;
                        private final Bundle args;

                        TabInfo(Class<?> _class, Bundle _args) {
                                clss = _class;
                                args = _args;
                        }
                }

                public TabsAdapter(ProvaActivity activity, ViewPager pager) {
                        super(activity.getSupportFragmentManager());
                        mContext = activity;
                        mActionBar = activity.getSupportActionBar();
                        mViewPager = pager;
                        mViewPager.setAdapter(this);
                        mViewPager.setOnPageChangeListener(this);
                }

                public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
                        TabInfo info = new TabInfo(clss, args);
                        tab.setTag(info);
                        tab.setTabListener(this);
                        mTabs.add(info);
                        mActionBar.addTab(tab);
                        notifyDataSetChanged();
                }

// The getCount() method should return the total number of fragments in the pager              
                @Override
                public int getCount() {
                        return mTabs.size();   
                }

// the getItem() method returns the fragment at the specified position.        
                @Override
                public Fragment getItem(int position) {
                        TabInfo info = mTabs.get(position);
                        return Fragment.instantiate(mContext, info.clss.getName(),
                                        info.args);
                }

//              These methods getCount() and getItem() will be called
//              as the user scrolls through the pages. Adjacent fragments are acquired before
//              they are visible so that the UI can display them while the user is paging              
               
                @Override
                public void onPageScrolled(int position, float positionOffset,
                                int positionOffsetPixels) {
                }

                @Override
                public void onPageSelected(int position) {
                        mActionBar.setSelectedNavigationItem(position);
                }

                @Override
                public void onPageScrollStateChanged(int state) {
                }

                @Override
                public void onTabSelected(Tab tab, FragmentTransaction ft) {
                        Object tag = tab.getTag();
                        for (int i = 0; i < mTabs.size(); i++) {
                                if (mTabs.get(i) == tag) {
                                        mViewPager.setCurrentItem(i);
                                }
                        }
                }

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

                }

                @Override
                public void onTabReselected(Tab tab, FragmentTransaction ft) {
                }
        }
[/quote]

Offline ilprofugo

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Next
  • Play Store ID:
    Fabrizio Consalvi
Re:Problema getItem su ViewPager
« Risposta #1 il: 25 Luglio 2013, 12:11:09 CEST »
0
Prendendo spunto da questa discussione http://stackoverflow.com/questions/5297842/how-to-handle-oncontextitemselected-in-a-multi-fragment-activity ho risolto impostando la questa condizione nel onContextItemSelected

Codice (Java): [Seleziona]
        public boolean onContextItemSelected(MenuItem item) {
                if (getUserVisibleHint() == false) {
                        return false;
                }
                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                                .getMenuInfo();

                switch (item.getItemId())