如何通过动画按比例缩放ViewHolder的宽度与高度?

问题描述 投票:0回答:1

我有以下布局文件-

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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/fragment_marketplace_root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/fragment_marketplace_appbarlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"
        android:fitsSystemWindows="true">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="220dp"
            android:fitsSystemWindows="true"
            android:minHeight="150dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
            app:titleEnabled="false">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                app:layout_collapseMode="pin"
                app:layout_collapseParallaxMultiplier="0">

                <com.twoverte.views.ClearableAutoCompleteTextView
                    android:id="@+id/fragment_marketplace_searchview"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="14dp"
                    android:layout_marginEnd="14dp"
                    android:completionThreshold="0"
                    android:hint="@string/fragment_marketplace_search_hint"
                    android:iconifiedByDefault="false"
                    android:inputType="text|textAutoCorrect"
                    android:maxLength="25"
                    android:textIsSelectable="false"
                    android:textSelectHandle="@xml/empty_shape"
                    tools:layout_editor_absoluteX="1dp"
                    tools:layout_editor_absoluteY="1dp" />

                <TextView
                    android:id="@+id/fragment_marketplace_discover_products_from_myverte_textview"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="14dp"
                    android:layout_marginTop="15dp"
                    android:fontFamily="@font/noto_sans"
                    android:text="@string/fragment_marketplace_discover_products_from_myverte"
                    android:textSize="17sp"
                    android:visibility="gone"
                    tools:visibility="visible" />

            </LinearLayout>

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/fragment_marketplace_vendors_recycler_view"
                android:layout_width="wrap_content"
                android:layout_height="130dp"
                android:layout_gravity="bottom"
                android:minHeight="40dp"
                android:orientation="horizontal"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="1"
                app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
                tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
                tools:listitem="@layout/fragment_marketplace_vendor_row_item" />

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:id="@+id/fragment_marketplace_featured_products_nested_scroll_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <TextView
                android:id="@+id/fragment_marketplace_featured_products_textview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/very_light_grey"
                android:fontFamily="@font/noto_sans"
                android:paddingStart="14dp"
                android:paddingLeft="14dp"
                android:paddingTop="15dp"
                android:paddingEnd="14dp"
                android:text="@string/fragment_marketplace_featured_products"
                android:textSize="17sp"
                android:visibility="gone"
                tools:visibility="visible" />

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/fragment_marketplace_products_recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:background="@color/very_light_grey"
                app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
                tools:itemCount="2"
                tools:listitem="@layout/fragment_marketplace_products_row_item" />

            <View
                android:id="@+id/activity_product_page_bottom_view"
                android:layout_width="match_parent"
                android:layout_height="70dp"
                android:layout_marginTop="60dp"
                android:background="@color/light_black"
                android:visibility="gone"
                tools:visibility="visible" />

        </LinearLayout>


    </androidx.core.widget.NestedScrollView>


</androidx.coordinatorlayout.widget.CoordinatorLayout>

并且在我的onViewCreated中,我有以下代码-


import kotlinx.android.synthetic.main.fragment_marketplace.fragment_marketplace_vendors_recycler_view as vendorsList

...
...

// onViewCreated ->

 val originalVendorListHeight: Int = vendorsList.layoutParams?.height!!
        appBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, value ->
            vendorsList.updateLayoutParams {
                this.height = originalVendorListHeight + value
                (this as CollapsingToolbarLayout.LayoutParams).setMargins(0, 0, 0, abs(value))
            }
        })

哪个创建了动画的顶部水平RV动画,其高度随着高度的增加而下降,直到达到所需的上限。

我现在面临的问题是,RV内的每个ViewHolder都不成比例,因为我只是更改高度而不是宽度,而我正面临一个尝试设置每个VH宽度的问题,因为我无法像以前一样依靠它的父大小和高度。

这是我的适配器和VH-

class VendorAdapter(private val miniVendorModels: List<MiniVendorModel>, private val context: Context) : RecyclerView.Adapter<VendorsHolder>() {

    companion object {
        const val EXTRA_VENDOR_MODEL = "EVM"
    }

    private val vendorsHoldersList = mutableListOf<VendorsHolder>()

    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): VendorsHolder {
        val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.fragment_marketplace_vendor_row_item, viewGroup, false)
        val vendorsHolder = VendorsHolder(view)
        vendorsHoldersList.add(vendorsHolder)
        return vendorsHolder
    }

    override fun onBindViewHolder(vendorsHolder: VendorsHolder, i: Int) {
        val model = miniVendorModels[i]
        Picasso.get().load(model.bannerPicture).into(vendorsHolder.vendorImageView)
        vendorsHolder.vendorImageView.setOnClickListener { v: View? ->
            try {
                val intent = Intent(context, VendorPageActivity::class.java)
                intent.putExtra(EXTRA_VENDOR_MODEL, model)
                context.startActivity(intent)
            } catch (e: Exception) {
                e.printStackTrace()
                Toast.makeText(context, ResourceHelper.getString(R.string.marketplace_vendor_unavailable), Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun getItemCount(): Int = miniVendorModels.size

}
class VendorsHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var vendorImageView: ImageView = itemView.findViewById(R.id.vendors_row_item_imageview)
    var rootLayout: ConstraintLayout = itemView.findViewById(R.id.vendors_row_item_root_layout)
    var vendorHolderCardview: CardView = itemView.findViewById(R.id.search_image_contact_cardview)

}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/vendors_row_item_root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.cardview.widget.CardView
        android:id="@+id/search_image_contact_cardview"
        android:layout_width="152dp"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        app:cardCornerRadius="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/vendors_row_item_imageview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            tools:src="@mipmap/ic_launcher" />


    </androidx.cardview.widget.CardView>


</androidx.constraintlayout.widget.ConstraintLayout>

您可以看到,ViewHolders的高度为Match Parent,这意味着它们将与父母一起扩展。

我不能对宽度使用相同的技巧,因为它是水平RV,因此我将需要使用其他方法来启用和减小RV的所有VH宽度。

android android-recyclerview width android-viewholder
1个回答
0
投票

已解决-

© www.soinside.com 2019 - 2024. All rights reserved.