ViewPager/PagerAdapter показывает все представления на первой странице

Что происходит
ViewPager в моем приложении показывает все представления, которые я создал на первой странице. Например, если я создаю два представления, оба представления отображаются на первой странице, а вторая страница просто пуста.

Изображения, демонстрирующие проблему
Как вы можете видеть ниже, первая страница содержит обе страницы, а вторая страница пуста.

Первая страницаСтраница вторая

Я не могу понять, почему это происходит. Уже давно с этим боремся. Я пытался не добавлять представление в адаптер, добавляя представление, а также предоставляя индекс, не раздувая его, а создавая ImageView в адаптере и т. д.

Что мне не хватает? Любая помощь будет оценена по достоинству!

Код
Действие

[Activity(Label = "Foto's", ScreenOrientation = ScreenOrientation.Portrait)]
public class PicturesActivity : BaseActivity
{
    private ImagePagerAdapter _imageAdapter;
    private List<string> _filePaths;
    private ViewPager _viewPager;

    private const int _maxPictures = 5;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Pictures);
        _viewPager = FindViewById<ViewPager>(Resource.Id.ViewPager);
    }

    protected override void OnStart()
    {
        base.OnStart();

        _imageAdapter = new ImagePagerAdapter(this, _filePaths);
        _viewPager.Adapter = _imageAdapter;
        _viewPager.SetCurrentItem(0, false);
    }
}

Адаптер пейджера

internal class ImagePagerAdapter : PagerAdapter
{
    Activity _activity;
    List<string> _filePaths;

    public ImagePagerAdapter(Activity activity, List<string> filePaths)
    {
        _activity = activity;
        _filePaths = filePaths;
    }

    public override Java.Lang.Object InstantiateItem(ViewGroup container, int position)
    {
        var view = _activity.LayoutInflater.Inflate(Resource.Layout.PicturePageItem, container, false);
        var imageView = view.FindViewById<ImageView>(Resource.Id.ImageView);
        var filePath = _filePaths[position];

        DisplayMetrics metrics = _activity.Resources.DisplayMetrics;
        using (var bitmap = BitmapHelper.GetResizedBitmap(filePath, new Size(metrics.WidthPixels, metrics.HeightPixels)))
            imageView.SetImageBitmap(bitmap);

        container.JavaCast<ViewPager>().AddView(view);
        return view;
    }

    public override void DestroyItem(ViewGroup container, int position, Java.Lang.Object @object)
    {
        var view = (LinearLayout)@object;
        var imageView = view.FindViewById<ImageView>(Resource.Id.ImageView);

        if (imageView != null && imageView.Drawable != null)
        {
            imageView.Drawable.Dispose();
            imageView.SetImageBitmap(null);
        }

        container.JavaCast<ViewPager>().RemoveView(view);
    }

    public override int Count
    {
        get { return _filePaths.Count; }
    }

    public override bool IsViewFromObject(View view, Java.Lang.Object @object)
    {
        return view is LinearLayout;
    }
}

Макет изображений

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v4.view.ViewPager
        android:id="@+id/ViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Макет PicturePageItem (макет страницы адаптера)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/ImageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerInside" />
</LinearLayout>

person avb    schedule 01.06.2015    source источник
comment
Как выглядит ваш макет страницы?   -  person Cheesebaron    schedule 01.06.2015
comment
@Cheesebaron, посмотри мой обновленный вопрос!   -  person avb    schedule 01.06.2015


Ответы (1)


Я думаю, проблема может быть связана с вашим методом IsViewFromObject().

Этот метод вызывается для сравнения представления с объектом Key. Ваша версия всегда возвращает true, поэтому ViewPager считает, что все ваши представления находятся на одной странице.

Вы должны изменить свой код следующим образом:

public override bool IsViewFromObject(View view, Java.Lang.Object @object)
{
    return (object)view == @object;
}

Подробнее см.:

http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html

person Kiliman    schedule 01.06.2015
comment
Это полностью исправило это! Большое спасибо! Думаю, я слишком много внимания уделял этой реализации InstantiateItem. Я думаю, что это странный метод в любом случае. Почему бы базовому классу не сделать сравнение самому? Мне кажется, так будет всегда... - person avb; 01.06.2015
comment
Вы наследуете от PagerAdapter. Согласно документации, это очень простая реализация. Обычно вы используете более конкретную реализацию, такую ​​как FragmentPagerAdapter и т. д. Для них вы должны переопределить только метод GetItem() и свойство Count вместо < i>InstantiateItem() и т. д. Эти классы берут на себя всю бухгалтерию. - person Kiliman; 01.06.2015
comment
Хорошо, это немного проясняет ситуацию, спасибо. Я происхожу из этого класса, поэтому мне не нужно создавать фрагменты. Мне просто нужно показать некоторые изображения :) - person avb; 01.06.2015