Recyclerview показывает только один элемент - PullRequest
0 голосов
/ 30 января 2020

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

У меня есть 2 элемента в списке, в котором есть дата и список изображений. Я могу видеть только 1-ую дату и одно изображение из 3-х и другие изображения в 1-м элементе, а 2-й элемент не виден.

Я использую диспетчер gridlayout для просмотра переработчика.

Ниже мой адаптер и фрагмент кода.

public class MediaAdapter extends  RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private ArrayList<Media> mediaArrayList;
    private Context context;
    public static final int TYPE_HEADER = 0;
    public static final int TYPE_ITEM = 1;
    private ArrayList<String> imageURls;

    public MediaAdapter(Context context,ArrayList<Media> mediaArrayList)
    {
        this.context = context;
        this.mediaArrayList = mediaArrayList;
        this.imageURls = new ArrayList<>();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        if (viewType == TYPE_HEADER) {
            View v = inflater.inflate(R.layout.media_item_header_layout, parent, false);
            return new MediaViewHeader(v);
        } else {
            View v = inflater.inflate(R.layout.media_item_layout, parent, false);
            return new MediaItemView(v);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        Media media = mediaArrayList.get(position);

        if (holder instanceof MediaViewHeader) {

            MediaViewHeader mediaViewHeader = (MediaViewHeader) holder;
            mediaViewHeader.textViewDate.setText(media.getDate());

        } else if (holder instanceof MediaItemView) {

            MediaItemView mediaItemView = (MediaItemView) holder;
            imageURls = media.getImageUrl();

            for (String url : imageURls) {

                if (!TextUtils.isEmpty(media.getImageUrl().toString())) {
                    Picasso.get()
                            .load(url)
                            .resize(300, 250)
                            .placeholder(R.drawable.progress_animation_small)
                            .error(R.drawable.ic_avatar_small)
                            .into(mediaItemView.imageViewPhoto);
                } else {
                    mediaItemView.imageViewPhoto.setImageDrawable(ContextCompat.getDrawable(context,
                            R.drawable.ic_avatar_small));
                }
            }
        }
    }

        @Override
        public int getItemCount () {
            return mediaArrayList.size();
        }

        @Override
        public int getItemViewType ( int position){
            if (isPositionHeader(position))
                return TYPE_HEADER;
            else return TYPE_ITEM;

        }

        private boolean isPositionHeader ( int position){
            return position == 0;
        }

        class MediaItemView extends RecyclerView.ViewHolder {
            ImageView imageViewPhoto;

            public MediaItemView(View itemView) {
                super(itemView);
                imageViewPhoto = itemView.findViewById(R.id.image_photo);
            }
        }

        class MediaViewHeader extends RecyclerView.ViewHolder {

            private TextView textViewDate;

            public MediaViewHeader(View itemView) {
                super(itemView);
                textViewDate = itemView.findViewById(R.id.text_date);
            }
        }


}

Я проверил, получаю ли я ответ от API. Я получаю следующий ответ.

{
    "status": "success",
    "requestId": null,
    "result": {
        "media": [{
                "date": "03 April 19",
                "imageUrl": ["https://i.imgur.com/I86rTVl.jpg", "https://i.imgur.com/I86rTVl.jpg", "https://i.imgur.com/I86rTVl.jpg"]
            },

            {
                "date": "02 April 19",
                "imageUrl": ["https://i.imgur.com/I86rTVl.jpg", "https://i.imgur.com/I86rTVl.jpg", "https://i.imgur.com/I86rTVl.jpg"]
            }
        ]
    }
}

Ниже настроено представление переработчика

 public void setUpRecyclerView() {

        mediaArrayList = new ArrayList<>();

        final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3);
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {

            @Override
            public int getSpanSize(int position) {
                if (MediaAdapter.TYPE_HEADER == mediaAdapter.getItemViewType(position)) {
                    return 1;
                }
                return 2;
            }
        });
        recyclerViewMedia.setLayoutManager(gridLayoutManager);
        mediaAdapter = new MediaAdapter(getActivity(), mediaArrayList);
        recyclerViewMedia.setAdapter(mediaAdapter);
        getMediaList();
    }

Пожалуйста, проверьте. Спасибо ...

РЕДАКТИРОВАТЬ:

media_item_header_layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/text_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="#70666666"
        android:fontFamily="@font/notosans_semibold"
        android:letterSpacing="-0.02"
        android:text="03 April 19 "
        android:layout_marginTop="21dp"/>

</LinearLayout>

media_item_layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/image_photo"
        android:layout_width="96dp"
        android:layout_height="96dp"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="16dp"
        android:background="@drawable/media_item_image_background">
    </ImageView>


</RelativeLayout>

media_fragment

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f8f8fb">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview_media"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginRight="@dimen/padding_20"
        android:layout_marginLeft="@dimen/padding_20">

    </androidx.recyclerview.widget.RecyclerView>


</RelativeLayout>

I см. этот макет после ответа

введите описание изображения здесь

1 Ответ

0 голосов
/ 30 января 2020

измените это:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/text_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="#70666666"
        android:fontFamily="@font/notosans_semibold"
        android:letterSpacing="-0.02"
        android:text="03 April 19 "
        android:layout_marginTop="21dp"/>

</LinearLayout>

на это:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="wrap_content" <----
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/text_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="#70666666"
        android:fontFamily="@font/notosans_semibold"
        android:letterSpacing="-0.02"
        android:text="03 April 19 "
        android:layout_marginTop="21dp"/>

</LinearLayout>

Вы устанавливаете менеджер компоновки сетки с 3 столбцами, но ширина столбца составляет "match_parent", если вы начинаете прокручивать горизонтально , когда вы измените его на "wrap_content", вы увидите, что ваши вещи есть, на нем будут показаны все возможные элементы, которые могут уместиться на 1 ширину экрана

...