2015-02-06 16 views
5

Mam problemy z implementacją mojego niestandardowego PagerAdaptera i używanie go z ViewPagerem. Ten przykładowy PagerAdapter ma 10 elementów, każdy element jest przyciskiem z indeksem jako tekstem. Po uruchomieniu programu widzę przycisk z tekstem "1" zamiast "0". A kiedy przesuniemy do innych elementów, otrzymuję tylko puste widoki. Kiedy przesuwać do tyłu czasami widzę przycisk z pewną liczbą, ale znika (może to jest zniszczenie i usuwam go z pojemnika), a czasami widzę przycisk z numerem, ale liczba zmienia się po przesunięciu (myślę Tworzę nowy Button i dodaję go do kontenera iz jakiegoś powodu viewpager pokazuje ten nowy przycisk).Prawidłowe wdrażanie PagerAdapter w Androidzie

Jak mogę naprawić tę implementację? Nie widziałem różnicy w przykładach.

Moja implementacja PagerAdapter:

public class MyPagerAdapter extends PagerAdapter { 

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

    @Override 
    public boolean isViewFromObject(View view, Object o) { 
     return o.getClass()==view.getClass(); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Button button = new Button(container.getContext()); 
     ViewGroup.LayoutParams params = new ActionBar.LayoutParams(-1,-1); 
     button.setLayoutParams(params); 
     button.setText(String.valueOf(position)); 
     container.addView(button); 
     return button; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((Button)object); 
    } 
} 

A mój aktywny:

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ViewPager pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(new MyPagerAdapter()); 
    } 
} 
+3

Wymień 'o.getClass() == view.getClass()' z 'o == view' w metodzie' isViewFromObject() '. – corsair992

Odpowiedz

11

Oto kompletny kod:

układ xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:orientation="vertical" 
    tools:context="com.example.androidviewpagerapp.MainActivity" > 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

</LinearLayout> 

klasa MyPagerAdapter:

import android.support.v4.view.PagerAdapter; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.Toast; 

public class MyPagerAdapter extends PagerAdapter { 

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

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

    @Override 
    public Object instantiateItem(final ViewGroup container, int position) { 
     Button button = new Button(container.getContext()); 
     ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     button.setLayoutParams(params); 
     button.setText(String.valueOf(position)); 

     final int page = position; 
     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Toast.makeText(container.getContext(), "You clicked: " + page + ". page.", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     container.addView(button); 
     return button; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((Button)object); 
    } 
} 

główną działalność:

import android.support.v4.view.ViewPager; 
import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 
    ViewPager viewPager; 
    MyPagerAdapter myPagerAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     viewPager = (ViewPager)findViewById(R.id.pager); 
     myPagerAdapter = new MyPagerAdapter(); 
     viewPager.setAdapter(myPagerAdapter); 
    } 
} 

Przekonasz się, że przyciski są na pełnym ekranie. Aby tego uniknąć, musisz utworzyć układ (np. LinearLayout) i dodać przycisk do tego układu.

Przykład:

import android.support.v4.view.PagerAdapter; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.Toast; 

public class MyPagerAdapter extends PagerAdapter { 

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

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

    @Override 
    public Object instantiateItem(final ViewGroup container, int position) { 
     Button button = new Button(container.getContext()); 
     ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     button.setLayoutParams(params); 
     button.setText(String.valueOf(position)); 

     LinearLayout layout = new LinearLayout(container.getContext()); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 

     //add buton to layout 
     layout.addView(button); 

     final int page = position; 
     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Toast.makeText(container.getContext(), "You clicked: " + page + ". page.", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     //to container add layout instead of button 
     container.addView(layout); 
     //return layout instead of button 
     return layout; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     //cast to LinearLayout 
     container.removeView((LinearLayout)object); 
    } 
} 
+0

Czy masz odpowiedź? –

+0

Jeśli to rozwiązanie, zaakceptuj moją odpowiedź. – 633kM

+0

Czy pager widoku znajduje się w pliku xml MainActivity? – pewpew

3

jeśli chcesz nadmuchać widoki w pager trzeba zaimplementować dwie metody. instantiateItem i destroyItem

public class DialogPagerAdapter extends PagerAdapter { 

    private Context mContext; 

    //view inflating.. 
    @Override 
    public Object instantiateItem(ViewGroup collection, int position) { 
     LayoutInflater inflater = LayoutInflater.from(mContext); 
     ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.account_dialog_signin_viewpagers, 
       collection, false); 

     TextView tvLabel = (TextView) layout.findViewById(R.id.textView); 
     switch (position) { 
      case 0: 
       tvLabel.setText("Log In"); 
       tvLabel.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 
        } 
       }); 
       break; 
      case 1: 
       tvLabel.setText("Sign Up"); 
       tvLabel.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 
        } 
       }); 
       break; 
      case 2: 
       tvLabel.setText("Send Reset Link"); 
       tvLabel.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         //onOptionClickForgot.OnOptionClick(); 
        } 
       }); 
       break; 
     } 

     collection.addView(layout); 
     return layout; 
    } 

    @Override 
    public void destroyItem(ViewGroup collection, int position, Object view) { 
     collection.removeView((View) view); 
} 

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

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

Wystarczy nazwać jak

viewPager.setAdapter(new DialogPagerAdapter); 

xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/dialog_button_height" 
    android:paddingLeft="@dimen/dimen_2" 
    android:paddingRight="@dimen/dimen_2" 
    android:minHeight="@dimen/dialog_button_height"> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerInParent="true" 
     android:gravity="center" 
     android:text="@string/app_name" 
     android:textColor="@color/white" 
     android:textSize="@dimen/text_size_medium" /> 
</RelativeLayout>