Correctly implementing PagerAdapter in Android

前端 未结 2 851
无人及你
无人及你 2020-12-09 11:59

I have problems with implementation of my custom PagerAdapter and using it with a ViewPager. This sample PagerAdapter has 10 items, every item is a button with it\'s index a

2条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-09 12:27

    Here is complete code:

    xml layout:

    
    
        
    
    
    

    MyPagerAdapter class:

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

    You will see that Buttons are full screen. To avoid that you need to create some layout (like LinearLayout) and add button to that layout.

    Example:

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

提交回复
热议问题