2015-02-06 43 views
5

Tôi gặp vấn đề với việc triển khai PagerAdapter tùy chỉnh của mình và sử dụng nó với một ViewPager. Mẫu PagerAdapter này có 10 mục, mỗi mục là một nút có chỉ mục là văn bản. Khi tôi chạy chương trình của mình, tôi thấy một nút có văn bản '1' được tạo từ '0'. Và khi tôi vuốt sang các mục khác, tôi chỉ nhận được chế độ xem trống. Khi tôi vuốt ngược lại, đôi khi tôi thấy nút có số, nhưng nó biến mất (có thể nó đang phá hủy và tôi xóa nó khỏi vùng chứa) và đôi khi tôi thấy một nút có số, nhưng số thay đổi sau khi vuốt (tôi nghĩ Tôi tạo một Button mới và thêm nó vào container, và vì một số lý do mà viewpager hiển thị nút mới này).Thực hiện đúng PagerAdapter trong Android

Tôi làm cách nào để khắc phục việc triển khai này? Tôi đã không thấy sự khác biệt trong các ví dụ.

thực hiện PagerAdapter của tôi:

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

Và Hoạt động của tôi:

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

Thay thế 'o.getClass() == view.getClass() ' với 'o == view' trong phương thức' isViewFromObject() '. – corsair992

Trả lời

11

Dưới đây là mã hoàn chỉnh:

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

lớp 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); 
    } 
} 

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

Bạn sẽ thấy rằng Buttons là toàn màn hình. Để tránh điều đó, bạn cần phải tạo một số bố trí (như LinearLayout) và thêm nút vào bố cục đó.

Ví dụ:

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

Bạn có câu trả lời không? –

+0

Nếu đây là giải pháp, vui lòng chấp nhận câu trả lời của tôi. – 633kM

+0

Trình xem trang có nằm trong tệp xml MainActivity không? – pewpew

3

nếu bạn muốn để tăng điểm trong pager bạn phải có để thực hiện hai phương pháp. instantiateItem và 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; 
    } 
} 

Đơn giản chỉ cần gọi nó như

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> 
Các vấn đề liên quan