RecyclerView не отображает все элементы с ScrollView, а средние элементы растягиваются с помощью NestedScrollView - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть сетка, поддерживаемая recyclerview внутри ConstraintLayout внутри ScrollView.

Хотя в setList() вставлено 20 элементов (я его отладил), при использовании ScrollView

отображаются только 9 элементов. При переключении на NestedScrollView отображаются все 20 элементов,но предметы посередине растянуты. Не изображения, но кажется, что фон растянут в 3 раза больше фактического размера элемента / изображения.

Я использую библиотеки androidx.

Макет фрагмента

<?xml version="1.0" encoding="utf-8"?>
<ScrollView   xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark"
        tools:context=".ui.details.DetailsFragment">

        <ImageView
            android:id="@+id/detail_backdrop"
            android:layout_width="match_parent"
            android:layout_height="220dp"
            android:clickable="true"
            android:focusable="true"
            android:foreground="?attr/selectableItemBackground"
            android:scaleType="centerCrop"
            android:src="@drawable/clapperboard"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/play_symbol"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="@+id/detail_backdrop"
            app:layout_constraintEnd_toEndOf="@+id/detail_backdrop"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/detail_backdrop"
            app:srcCompat="@drawable/ic_play_circle_outline_white_96dp" />

        <ProgressBar
            android:id="@+id/details_progress_bar"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        Some other views...

        <TextView
            android:id="@+id/tv_my_list_details"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/my_list_at_details"
            app:layout_constraintEnd_toEndOf="@+id/wish_list_btn"
            app:layout_constraintStart_toStartOf="@+id/wish_list_btn"
            app:layout_constraintTop_toBottomOf="@id/wish_list_btn" />


        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_recommended"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="none"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tv_my_list_details"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

Макет элемента списка

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/movie_card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="true"
    android:layout_marginRight="5dp"
    android:layout_marginEnd="5dp"
    android:layout_marginLeft="5dp"
    android:layout_marginStart="5dp"
    android:layout_marginTop="10dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/movie_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:focusable="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/iv_poster"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="false"
            android:focusable="false"
            android:scaleType="centerCrop"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:src="@drawable/clapperboard" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

Адаптер

package com.lacourt.myapplication.ui.details

import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Point
import android.graphics.drawable.Drawable
import android.util.DisplayMetrics
import android.util.Log
import android.view.Display
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.lacourt.myapplication.AppConstants
import com.lacourt.myapplication.R
import com.lacourt.myapplication.dto.DbMovieDTO
import com.lacourt.myapplication.ui.OnItemClick
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.movie_list_item.view.*

class RecommendedAdapter(
    private val context: Context?,
    private val onItemClick: OnItemClick,
    private var list: ArrayList<DbMovieDTO>
) : RecyclerView.Adapter<RecommendedHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecommendedHolder {
        val view =
            LayoutInflater.from(context).inflate(R.layout.list_item_recommended, parent, false)
        return RecommendedHolder(view)
    }

    override fun getItemCount(): Int {
        return list.size
    }

    override fun onBindViewHolder(holder: RecommendedHolder, position: Int) {
        Log.d("grid-log", "onBindViewHolder() called, position = $position, list.size = ${list.size}")
        // get device dimensions
        val displayMetrics = DisplayMetrics()
        (context as Activity).windowManager.defaultDisplay.getMetrics(displayMetrics)

        val width = displayMetrics.widthPixels

        val maxHeight= width.div(3) * 1.5
        holder.poster.minimumHeight = maxHeight.toInt()

        holder.apply {
           Picasso.get()
                .load("${AppConstants.TMDB_IMAGE_BASE_URL_W185}${list[position].poster_path}")
                .placeholder(R.drawable.clapperboard)
                .into(poster)

            cardView.setOnClickListener {
                val id = list[position].id
                if (id != null)
                    onItemClick.onItemClick(id)
                else
                    Toast.makeText(
                        context,
                        "Sorry. Can not load this movie. :/",
                        Toast.LENGTH_SHORT
                    ).show()

            }
        }

    }

    fun setList(list: List<DbMovieDTO>) {
        Log.d("grid-log", "setList() called")
        this.list.clear()
        this.list.addAll(list)
        notifyDataSetChanged()
    }
}

class RecommendedHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var poster = itemView.iv_poster
    var cardView = itemView.movie_card_view
}


Какие-нибудь решения для этого странного поведения?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Поскольку вы используете макет ограничения, вы должны разрешить ограничениям устанавливать размер, в общем случае.

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_recommended"
        android:layout_width="0dp"
        android:layout_height="dp"
        ...

0dp в этом случае означает, что ограничения позволяют задавать значение.

0 голосов
/ 06 ноября 2019

Так как это может кому-то помочь в будущем, я нашел решение:

Я просто добавил holder.cardView.layoutParams.height = maxHeight.toInt() к onBindViewHolder моего класса адаптера, и теперь каждый макет элемента имеет правильный размер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...