2015-02-06 19 views
5

Ich habe Probleme mit der Implementierung meines benutzerdefinierten PagerAdapter und verwenden es mit einem ViewPager. Dieses Beispiel PagerAdapter hat 10 Elemente, jedes Element ist eine Schaltfläche mit seinem Index als Text. Wenn ich mein Programm starte, sehe ich eine Schaltfläche mit dem Text '1' anstelle von '0'. Und wenn ich zu anderen Objekten wische, bekomme ich nur leere Ansichten. Wenn ich rückwärts wische, sehe ich manchmal eine Taste mit einer Nummer, aber sie verschwindet (vielleicht zerstört sie und ich entferne sie aus dem Container), und manchmal sehe ich eine Taste mit einer Nummer, aber die Nummer ändert sich nach dem Streichen (denke ich Ich erstelle eine neue Schaltfläche und füge sie dem Container hinzu, und aus bestimmten Gründen zeigt der viewpager diese neue Schaltfläche an.Richtiges Implementieren von PagerAdapter in Android

Wie kann ich diese Implementierung reparieren? Ich habe keinen Unterschied in Beispielen gesehen.

Meine PagerAdapter Implementierung:

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); 
    } 
} 

Und meine Aktivität:

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

Ersetzen 'o.getClass() == view.getClass()' mit 'o == view' in der' isViewFromObject() 'Methode. – corsair992

Antwort

11

Hier vollständige Code ist:

xml Layout:

<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> 

MyPagerAdapter Klasse:

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); 
    } 
} 

MainActivity:

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); 
    } 
} 

Sie werden sehen, dass Buttons sind Vollbild. Um dies zu vermeiden, müssen Sie ein Layout erstellen (wie LinearLayout) und diesem Layout eine Schaltfläche hinzufügen.

Beispiel:

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

Hast du die Antwort bekommen? –

+0

Wenn dies die Lösung ist, akzeptiere bitte meine Antwort. – 633kM

+0

Befindet sich der Ansichtspager innerhalb der MainActivity-XML-Datei? – pewpew

3

, wenn Sie Ansichten in Pager aufblasen wollen, müssen Sie zwei Methoden implementieren. instantiateItem und 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; 
    } 
} 

Rufen Sie einfach es wie

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> 
Verwandte Themen