50 votes

Restez concentré sur ViewPager

J'utilise le ViewPager pour changer de vue avec un balayage gauche / droite.

Le ViewPager a besoin d'un adaptateur, j'ai donc construit celui-ci:

 public class ListViewPagerAdapter extends PagerAdapter {

protected static final String TAG = "ListViewPagerAdapter";
protected static final int NUM_VIEWS = 3;

protected final Activity mActivity;

public ListViewPagerAdapter(Activity activity) {
    mActivity = activity;
}

@Override
public int getCount() {
    return NUM_VIEWS;
}

@Override
public void startUpdate(View container) {}

@Override
public Object instantiateItem(View container, int position) {
    // ViewPager
    ViewPager viewPager = (ViewPager) container;

    // Wird verwendet, um die Views aufzurufen
    LayoutInflater layoutInflater = mActivity.getLayoutInflater();

    // Standardmäßig ist news eingeblendet
    View view = layoutInflater.inflate(R.layout.news_fragment, null);
    // Falls sich die Position verändert, so verändert sich auch die View
    if (position == 0) {
        view = layoutInflater.inflate(R.layout.favorite_fragment, null);
    } else if (position == 2) {
        view = layoutInflater.inflate(R.layout.videos_fragment, null);
    }

    // View einblenden
    viewPager.addView(view, 0);

    return view;
}

@Override
public void destroyItem(View container, int position, Object object) {
    // ViewPager
    ViewPager viewPager = (ViewPager) container;
    // View
    View view = (View) object;

    // View löschen
    viewPager.removeView(view);
}

@Override
public void finishUpdate(View container) {}

@Override
public boolean isViewFromObject(View view, Object object) {
    View _view = (View) object;
    return view == _view;
}

@Override
public Parcelable saveState() {
    return null;
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {}
 }
 

Maintenant, je veux obtenir la vue focalisée actuelle par le viewpager. J'ai essayé getChildAt (x), mais cela ne fonctionne pas.

Existe-t-il des exemples ou avez-vous une idée de la façon d’obtenir la vue actuelle?

Merci

89voto

Michael G. Points 701

Il est possible de sauvegarder l'objet actuellement actif (View, Fragment, ...) en remplaçant [PagerAdapter.setPrimaryItem] ( http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html setPrimaryItem% 28android.view.ViewGroup,% 20int,% 20java.lang.Object% 29 ). Par exemple:

 private View mCurrentView;

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    mCurrentView = (View)object;
}
 

41voto

Steren Points 665

Vous devez vous inscrire à un auditeur de votre ViewPager :

pager.setOnPageChangeListener(new MyPageChangeListener()); 

Vous devez personnaliser l'auditeur par l'extension d'un stub de l'auditeur:

private int focusedPage = 0;
private class MyPageChangeListener extends ViewPager.SimpleOnPageChangeListener {
    @Override
    public void onPageSelected(int position) {
        focusedPage = position;
    }
}

J'ai trouvé en regardant le ViewPager.java le code source de la bibliothèque de compatibilité. J'ai lu que nous pouvons faire plus, par exemple attraper onPageScrollStateChanged.

Pour construire la carte, j'ai utilisé le code sur ce blog. Vous pouvez avoir un coup d'oeil.

41voto

Artjom Points 889

Vous pouvez ajouter une balise à la vue créée avec la méthode instantiateItem:

 view.setTag(position);
 

Plus tard, vous pourrez accéder à la vue actuellement sélectionnée par:

 mPager.findViewWithTag(mPager.getCurrentItem());
 

4voto

Mark Renouf Points 13128

J'ai récemment eu besoin de mettre en œuvre cette solution exacte. Voici comment je l'ai fait:

 Map<Integer, Object> views = Maps.newHashMap();

@Override
public Object instantiateItem(View container, int position) {
  /* Create and add your View here */
  Object result = ???

  views.put(position, result);
  return result;
}

@Override
public void destroyItem(View container, int position, Object object) {
  /** Remove your View here */

  views.remove(position);
}

protected View findViewForPosition(int position) {
  Object object = views.get(position);
  if (object != null) {
    for (int i = 0; i < getChildCount(); i++) {
      View view = getChildAt(i);
      if (isViewFromObject(view, object)) {
        return view;
      }
    }
  }
  return null;
}
 

1voto

Nik Points 1937

Pour obtenir une vue focalisée, j'utilise cette méthode:

Lorsque je gonfle ma vue avant de l'ajouter à ViewPager, je lui attribue une balise. Ensuite, je vérifie cette balise.

 private View getCurrentView()
{
    for (int i = 0; i < pager.getChildCount(); i++)
    {
        View v = pager.getChildAt(i);
        if (v != null)
        {
            if (v.getTag().equals(pageList.get(pager.getCurrentItem()).getTag())) return v;
            // pageList is a list of pages that I pass to page adapter
        }
    }
    return null;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X