RecyclerView不会显示所有带有ScrollView的项目,并且中间的项目是使用NestedScrollView拉伸的

时间:2019-11-06 15:04:46

标签: android android-recyclerview scrollview

我有一个ScrollView内ConstraintLayout内的recyclerview支持的网格。

尽管在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 :(得分:0)

由于它可能会在将来对某人有所帮助,因此我找到了一种解决方案:

我刚刚在适配器类的holder.cardView.layoutParams.height = maxHeight.toInt()中添加了onBindViewHolder,现在每个项目的布局都正确。

答案 1 :(得分:0)

由于使用约束布局,因此通常应让约束设置大小。

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

0dp在这种情况下意味着让约束条件来设置值。