web-dev-qa-db-de.com

Android ViewPager liefert die aktuelle Ansicht

Ich habe einen ViewPager und möchte die aktuell ausgewählte und sichtbare Ansicht erhalten, keine Position. 

  1. getChildAt(getCurrentItem) liefert falsche View
  2. Das funktioniert nicht immer. Gibt manchmal Null zurück, manchmal nur falsche Ansicht.

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    
        if (isVisibleToUser == true) { 
            mFocusedListView = ListView; 
        }
    }
    
  3. PageListener auf ViewPager mit getChildAt() funktioniert auch nicht und gibt mir nicht jedes Mal die richtige Ansicht. 

Wie kann ich eine aktuelle sichtbare Ansicht erhalten?

View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
55
lacas

Ich habe es herausgefunden. Was ich tat, war, setTag() mit einem Namen für alle Views/ListViews aufzurufen, und einfach findViewWithTag(mytag) aufzurufen, mytag als Tag.

Leider gibt es keine andere Möglichkeit, dieses Problem zu lösen.

111
lacas

Ich bin gerade auf das gleiche Problem gestoßen und habe es mit folgendem behoben:

View view = MyActivity.mViewPager.getFocusedChild();
8
ZeCodea

Sie können das aktuelle Element abrufen, indem Sie über Ihren Adapter auf Ihre Liste der itens zugreifen. myAdapter.yourListItens.get(myViewPager.getCurrentItem()); Wie Sie sehen, kann ViewPager den aktuellen Index des Elements Ihres Adapters abrufen (aktuelle Seite).

Wenn Sie FragmentPagerAdapter verwenden, können Sie diese Umwandlung durchführen: 

FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();

und Ruf an

adapter.getItem(myViewPager.getCurrentItem());

Das funktioniert sehr gut für mich;)

7
Gilian

Verwenden Sie einen Adapter, der PagerAdapter erweitert, und setzen Sie die setPrimaryItem-Methode in Ihrem PagerAdapter außer Kraft.

https://developer.Android.com/reference/Android/support/v4/view/PagerAdapter.html

class yourPagerAdapter extends PagerAdapter
{
    // .......

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

    // .......

}
3
Andrés

wie sieht das für euch alle aus?

public Object instantiateItem(final ViewGroup container, final int position) {      
    CustomHomeView RL = new CustomHomeView(MainActivity.ctxt);
    if (position==0){
        container.setId(R.id.home_container);} ...rest of code

dann ist hier der Code, um auf Ihre Seite zuzugreifen

((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(pager.getCurrentItem()).setBackgroundColor(Color.BLUE);

Wenn Sie möchten, können Sie ein kleines Meathod einrichten

RelativeLayout getPageAt(int index){
    RelativeLayout rl =  ((RelativeLayout)((ViewGroup)pager.findViewById(R.id.home_container)).getChildAt(index));
    return rl;
}
2
Michael Kern

Während meiner Bemühungen, einen Weg zu finden, Android-Ansichten zu gestalten, denke ich, habe ich eine alternative Lösung für das Problem des OP definiert, das ich in meinem Blog dokumentiert habe. Ich verlinke darauf, da der Code ein bisschen zu viel ist, um alles hier aufzunehmen.

Die Lösung, die ich vorschlage:

  • hält den Adapter und die Ansicht vollständig getrennt
  • man kann leicht eine Ansicht mit einer beliebigen Indexform vom Ansichts-Pager abfragen und entweder null zurückgeben, wenn diese Ansicht derzeit nicht geladen ist, oder die entsprechende Ansicht.
2
Boris Strandjev

Ich benutze diese Methode mit Android.support.v4.view.ViewPager

View getCurrentView(ViewPager viewPager) {
        try {
            final int currentItem = viewPager.getCurrentItem();
            for (int i = 0; i < viewPager.getChildCount(); i++) {
                final View child = viewPager.getChildAt(i);
                final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams();

                Field f = layoutParams.getClass().getDeclaredField("position"); //NoSuchFieldException
                f.setAccessible(true);
                int position = (Integer) f.get(layoutParams); //IllegalAccessException

                if (!layoutParams.isDecor && currentItem == position) {
                    return child;
                }
            }
        } catch (NoSuchFieldException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalArgumentException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalAccessException e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }
2
Dmitry Yablokov

ist das deine erste tätigkeit auf dem bildschirm oder hast du schon einige übereinander geschichtet?

versuche dies:

findViewById(Android.R.id.content).getRootView()

oder nur:

findViewById(Android.R.id.content) 

auch je nachdem was du willst versuchen:

((ViewGroup)findViewById(Android.R.id.content)).getChildAt(0)
1
SunnySonic

Versuche dies 

 final int position = mViewPager.getCurrentItem();
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("Android:switcher:" + R.id.rewards_viewpager + ":"
            + position);
1

Ich musste es allgemeiner machen, also entschied ich mich für die private Position von ViewPager.LayoutParams

        final int childCount = viewPager.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = viewPager.getChildAt(i);
            final ViewPager.LayoutParams lp = (ViewPager.LayoutParams) child.getLayoutParams();
            int position = 0;
            try {
                Field f = lp.getClass().getDeclaredField("position");
                f.setAccessible(true);
                position = f.getInt(lp); //IllegalAccessException
            } catch (NoSuchFieldException | IllegalAccessException ex) {ex.printStackTrace();}
            if (position == viewPager.getCurrentItem()) {
                viewToDraw = child;
            }
        }
1
Kamen Dobrev

Sie können Fragment anhand der Systemkennung finden. Es ist Arbeit für mich. Ich habe es in OnMeasure verwendet.

id - viewPager ID 

position - Fragment, das Sie erhalten möchten

Wichtig! Sie erhalten dieses Fragment, wenn Ihr Fragment im Adapter erstellt wurde. Sie müssen also supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position) nullify überprüfen

Sie können wie folgt sehen:

supportedFragmentManager.findFragmentByTag("Android:switcher:" + id + ":" + position).view

Sie sollten kein benutzerdefiniertes Tag im Adapter angeben

Ich benutze ViewPagerUtils von FabulousFilter

ViewPagerUtils.getCurrentView(ViewPager viewPager)
0