Android ViewPager не показывает вторую страницу?

Я использую ViewPager, чтобы прокручивать только часть экрана (в отличие от всего вида/страницы).

Я могу взломать isViewFromObject, чтобы просто вернуть true, а затем появится мое первое изображение, но мое второе изображение не загрузится. Любые мысли о том, что мне здесь не хватает? Я думаю, что либо все еще что-то не так с моим методом isViewFromObject, либо с моим циклом for в экземпляре элемента.

Примечание. Намеренно НЕ используйте расширения FragmentStatePagerAdapter и расширения обычного PagerAdapter.

private class ScreenSlidePagerAdapter extends PagerAdapter {

        public ScreenSlidePagerAdapter() {}


        @Override
        public Object instantiateItem (ViewGroup container, int position) {
            LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

            int RLayoutId;
            RLayoutId = R.layout.images_to_show; //an XML with just a LinearLayout

            ViewGroup imageLayout = (ViewGroup) inflater.inflate(RLayoutId, null);

            for (position = 0; position < mImageURLArraylist.size(); position++) { 
                container.addView(insertPhoto("http:" + mImageURLArraylist.get(position) ) ); 
                        }//end of for loop
            return imageLayout;

        }

        @Override
        public boolean isViewFromObject (View view, Object obj) { //Object parameter is received from instantiateItem(ViewGroup, int)
//loads the first image successfully if i just do return true. 
//doesn't load any of my images when I do return view == ( (View) obj);

                }


        //one of four methods that you must override when using pageradapters
        @Override
        public int getCount() {
            //tested in debugging and this has the correct size (2)
            return mImageURLArraylist.size(); //the number of pages the adapter will create.
                }

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

    }//end of ScreenSlidePagerAdapter

Мой метод insertPhoto, который выполняется в instanceItem выше:

public View insertPhoto(String path){
        LinearLayout layout = new LinearLayout(getActivity());
        layout.setGravity(Gravity.CENTER);
        ImageView imageView = new ImageView(getActivity());
        imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        Picasso.with(getActivity() ).load(path).into(imageView); //tried this but got errors when running > resize(layout.getWidth(), layout.getHeight()), also tried .fit() after .load image wouldn't load
        layout.addView(imageView);
        return layout;        
}

person Noobprogrammer    schedule 24.04.2016    source источник


Ответы (2)


Метод InstantiateItem() класса PagerAdapter вызывается для каждой страницы, поэтому в контейнер следует вставлять только одну страницу/дочерний элемент.

    @Override
    public Object instantiateItem (ViewGroup container, int position) {
        final View page = insertPhoto("http:" + mImageURLArraylist.get(position) );
        container.addView(page); 
        return page;
    }

    @Override
    public boolean isViewFromObject (View view, Object obj) {
        return view == obj;
    }
person Giso Bartels    schedule 24.04.2016
comment
Это сработало! Большое спасибо Гисо! Тупой дополнительный вопрос, если можно, если бы я добавлял View в linearlayout, мне бы понадобился цикл for. Почему бы мне не здесь / как он выполняет итерацию по всем элементам (т.е. изображениям) без цикла for? - person Noobprogrammer; 25.04.2016
comment
@Noobprogrammer: это не так. ViewPager работает по-другому. На самом деле, он даже не загружает все страницы сразу. Вместо этого он только создает экземпляры соседних страниц и даже уничтожает страницы дальше для экономии памяти. Сколько страниц хранится в памяти, можно контролировать с помощью setOffscreenPageLimit() - person Giso Bartels; 25.04.2016

Вам нужно добавить представление в контейнер. Попробуйте изменить свой метод, как показано здесь:

    @Override
    public Object instantiateItem (ViewGroup container, int position) {
        LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

        int RLayoutId;
        RLayoutId = R.layout.images_to_show; //an XML with just a LinearLayout

        ViewGroup imageLayout = (ViewGroup) inflater.inflate(RLayoutId, container, false);

        container.addView(insertPhoto(imageLayout, "http:" + mImageURLArraylist.get(position) ));
        return imageLayout;

    }

// this needs to be refactored, too many viewgroups. Move all layouts to XML
public View insertPhoto(ViewGroup root, String path){
    LinearLayout layout = new LinearLayout(getActivity());
    layout.setGravity(Gravity.CENTER);
    ImageView imageView = new ImageView(getActivity());
    imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    Picasso.with(getActivity() ).load(path).into(imageView); //tried this but got errors when running > resize(layout.getWidth(), layout.getHeight()), also tried .fit() after .load image wouldn't load
    layout.addView(imageView);
    root.addView(layout);
    return root;        
}

Также было бы лучше, если бы ваш макет был полностью выполнен в XML, поэтому функция insertPhoto просто вызывает Picasso для загрузки изображения.

person Francesc    schedule 24.04.2016