Search code examples
androidandroid-viewpageradapter

How to close viewAdapter with button on last image?


what I am trying to do is close the image adapter at the click of a button placed in the third view.

I am setting the views following this tutorial and it works fine: https://www.journaldev.com/10096/android-viewpager-example-tutorial

Now what I am trying to do is close the adapter with a botton in the last view. I get an error that says that points the button: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

I think this is because the button is not on the main layout but on the view layout. so how can I acces it correctly to hide/close the adapter

this is the main

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

        textView3 = findViewById(R.id.textView3);

        textView3.setVisibility(View.INVISIBLE);

        btnClose=findViewById(R.id.btnClose);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new CustomPagerAdapter(this));
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                viewPager.setVisibility(View.INVISIBLE);
                textView3.setVisibility(View.VISIBLE);
            }
        });

    }

This is the adapter

public class CustomPagerAdapter extends PagerAdapter {

    private Context mContext;

    public CustomPagerAdapter(Context context) {
        mContext = context;
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position) {
        ModelObject modelObject = ModelObject.values()[position];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getLayoutResId(), collection, false);
        collection.addView(layout);
        return layout;
    }

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

    @Override
    public int getCount() {
        return ModelObject.values().length;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        ModelObject customPagerEnum = ModelObject.values()[position];
        return mContext.getString(customPagerEnum.getTitleResId());
    }

}

This is the model object class

public enum ModelObject {

    RED(R.string.red, R.layout.view_red),
    BLUE(R.string.blue, R.layout.view_blue),
    GREEN(R.string.green, R.layout.view_green);

    private int mTitleResId;
    private int mLayoutResId;

    ModelObject(int titleResId, int layoutResId) {
        mTitleResId = titleResId;
        mLayoutResId = layoutResId;
    }

    public int getTitleResId() {
        return mTitleResId;
    }

    public int getLayoutResId() {
        return mLayoutResId;
    }

}

Just to know how it works I want to hide the adapter and show a textview. Again I think the problem is the button being on another layout, so how can I call it?


Solution

  • Implement your listener in main class & pass it to viewpager. Attach the listener on demand, only the review view.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        textView3 = findViewById(R.id.textView3);
    
        textView3.setVisibility(View.INVISIBLE);
    
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                viewPager.setVisibility(View.INVISIBLE);
                textView3.setVisibility(View.VISIBLE);
            }
        }
        viewPager.setAdapter(new CustomPagerAdapter(this), listener);
        viewPager.setPageTransformer(true, new ZoomOutPageTransformer());
    }
    
    
    public class CustomPagerAdapter extends PagerAdapter {
    
        private Context mContext;
        private View.OnClickListener mListener;
    
        public CustomPagerAdapter(Context context, View.OnClickListener listener) {
            mContext = context;
            mListener = listener;
        }
    
        @Override
        public Object instantiateItem(ViewGroup collection, int position) {
            ModelObject modelObject = ModelObject.values()[position];
            LayoutInflater inflater = LayoutInflater.from(mContext);
            ViewGroup layout = (ViewGroup) inflater.inflate(modelObject.getLayoutResId(), collection, false);
            collection.addView(layout);
    
            if (position == 2) {
                View btnClose = layout.findViewById(R.id.btnClose);
                btnClose.setOnClickListener(mListener);
            }
            return layout;
        }
    
        @Override
        public void destroyItem(ViewGroup collection, int position, Object view) {
            collection.removeView((View) view);
        }
    
        @Override
        public int getCount() {
            return ModelObject.values().length;
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            ModelObject customPagerEnum = ModelObject.values()[position];
            return mContext.getString(customPagerEnum.getTitleResId());
        }
    }