Xamarin Android RecyclerView, отображающий изображения в противоположной ориентации - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над приложением Xamarin, в частности, над реализацией Android. Я не построил это первоначально. Я использую класс ModalDisplayImageAdapter, унаследованный от RecyclerView.Adapter. Изображения либо принимаются устройством, загружаются через приложение или загружаются из других источников (приложение iOS, сопровождающее веб-приложение) и загружаются в API. Все это работает без проблем.

Проблема в том, что приложение Android отображает изображение в перевернутой ориентации; он отображает ландшафтные изображения, как если бы они были портретными, и наоборот. Если я фотографирую на устройстве Android и загружаю его в API, оно корректно отображается на веб-сайте. Так что я знаю, что проблема не в механизме загрузки или самом изображении. Это просто приложение Android, которое отображает его неправильно. Если изображение в альбомной ориентации, RecyclerView растянет его в портретную рамку (пример внизу поста).

Модальное изображение XML находится здесь:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="@color/black"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
    android:id="@+id/image_modal_recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
<ImageButton
    android:id="@+id/download_image_button"
    android:tint="@color/white"
    android:background="@android:color/transparent"
    android:layout_gravity="left"
    style="@style/BadgeableImageButton"
    android:src="@drawable/icon_of_download"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<ImageButton
    android:id="@+id/image_modal_close"
    android:tint="@color/white"
    android:background="@android:color/transparent"
    android:layout_gravity="right"
    style="@style/BadgeableImageButton"
    android:src="@drawable/icon_of_cross"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Модал заполняется действием ImageModal. Метод OnCreate находится здесь:

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetupView();
        ActionBar.Hide();
        DataModel dataModel = _dataUtil.GetSelectedItem();            

        if (dataModel == null || !dataModel.EntryDataObject.HasFiles())
        {
            throw new ArgumentException("Item has no files");
        }

        _files = dataModel.EntryDataObject.Files.Where(file => file.HasThumbnail).ToList();

        if (!_files.Any())
        {
            throw new ArgumentException("Item has no images to display");
        }

        _closeButton.Click += CloseButtonOnClick;
        _downloadButton.Click += DownloadButtonOnClick;

        int position = Intent.GetIntExtra(IntentConstants.IMAGE_MODAL_POSITION, 0);
        LinearSnapHelper snapHelper = new LinearSnapHelper();
        snapHelper.AttachToRecyclerView(_imageRecycler);            
        _layoutManager = new LinearLayoutManager(this, LinearLayoutManager.Horizontal, false);                        
        _imageRecycler.SetLayoutManager(_layoutManager);
        _imageRecycler.SetAdapter(new ModalDisplayImageAdapter(_files));
        _layoutManager.ScrollToPosition(position);
    }

Во время отладки я посмотрел на DataModel и увидел свойство EntryDataString, которое имеет следующее значение:

"{\"mobileId\":0,\"text\":\"landscape photo\",\"files\":[{\"IsMigrated\":false,\"mobileId\":0,\"Id\":5047,\"BlobId\":…"

Так выглядит, как на фотографии Идентифицируется и сохраняется на устройстве правильно. Я просто не могу понять, почему ориентация не правильная.

Есть идеи ...? (Примечание: я новичок в этой технологии и в этом приложении, поэтому, возможно, я что-то упустил. Если да, дайте мне сейчас, и я отредактирую вопрос. Спасибо.)

enter image description here

РЕДАКТИРОВАТЬ: Изображение 2

enter image description here

1 Ответ

0 голосов
/ 16 апреля 2020

Хотите ли вы добиться результата, подобного следующему sceenshot?

enter image description here

Если это так, откройте представление инфлятора в RecyclerView.Adapter. Вы можете увидеть мой следующий код о inflaterView, значение android:layout_height было установлено wrap_content в FrameLayout, значение android:layout_height было установлено в CardView, LinearLayout и ImageView

<FrameLayout xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardElevation="4dp"
        card_view:cardUseCompatPadding="true"
        card_view:cardCornerRadius="5dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="8dp">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/imageView"
                android:scaleType="centerCrop" />
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="#333333"
                android:text="Caption"
                android:id="@+id/textView"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="4dp" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</FrameLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...