无法在RecyclerView中获取CoordinatorLayout LayoutParams

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

我想使用CoordinatorLayout实现滑动删除,所以我为RecyclerView的每个项目创建了简单的xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:id="@+id/coordinatorLayout"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/simpleModelName"
        android:layout_width="wrap_content"
        android:textSize="16sp"
        android:padding="10dp"
        android:layout_height="wrap_content" />

</android.support.design.widget.CoordinatorLayout>

和简单的适配器

open class SwipeableAdapter(val list:ArrayList<SimpleModel>) : RecyclerView.Adapter<SwipeableAdapter.ViewHolder>() {
    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var nameTextView: TextView
        var coordinatorLayout: CoordinatorLayout

        init {
            nameTextView = view.findViewById(R.id.simpleModelName)
            coordinatorLayout = view.findViewById(R.id.coordinatorLayout)
        }
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): SwipeableAdapter.ViewHolder {
        val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.item_simple_model, viewGroup, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(viewHolder: SwipeableAdapter.ViewHolder, position: Int) {
        viewHolder.nameTextView.text = list[position].name

        var swipe = SwipeDismissBehavior<View>()
        swipe.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_END_TO_START)
        swipe.setListener(object : SwipeDismissBehavior.OnDismissListener {
            override fun onDismiss(view: View?) {
            }

            override fun onDragStateChanged(state: Int) {
            }
        })

        Log.e("onBindViewHolder","layout "+viewHolder.coordinatorLayout.javaClass.toString())
        Log.e("onBindViewHolder","layout "+viewHolder.coordinatorLayout.layoutParams.javaClass.toString())
        val coordinatorLayoutParams = viewHolder.coordinatorLayout.layoutParams as CoordinatorLayout.LayoutParams
        coordinatorLayoutParams.behavior = swipe

    }

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

问题出在这一行:

    val coordinatorLayoutParams = viewHolder.coordinatorLayout.layoutParams as CoordinatorLayout.LayoutParams

我用stacktrace崩溃了:

java.lang.ClassCastException: android.support.v7.widget.RecyclerView$LayoutParams cannot be cast to android.support.design.widget.CoordinatorLayout$LayoutParams
 at app.deadmc.swipeablelayout.SwipeableAdapter.onBindViewHolder(SwipeableAdapter.kt:43)
 at app.deadmc.swipeablelayout.SwipeableAdapter.onBindViewHolder(SwipeableAdapter.kt:12)
 at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6508)
 at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6541)
 at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5484)
 at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5750)
 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5589)
 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5585)
 at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2231)
 at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1558)
 at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1518)
 at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:610)
 at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3719)
 at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3135)
 at android.view.View.measure(View.java:19861)
 at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:934)
 at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:973)

好的,开始检查问题是什么,记录下来,然后找到了

        Log.e("tag","layout "+viewHolder.coordinatorLayout.javaClass.toString())
        Log.e("tag","layout "+viewHolder.coordinatorLayout.layoutParams.javaClass.toString())

展会

12-29 13:46:16.310 19129-19129/? E/tag: layout class android.support.design.widget.CoordinatorLayout
12-29 13:46:16.310 19129-19129/? E/tag: layout class android.support.v7.widget.RecyclerView$LayoutParams

问题是:

我究竟做错了什么?为什么CoordinatorLayout给我RecyclerView$LayoutParams

android kotlin android-coordinatorlayout coordinator-layout
2个回答
2
投票

coordinatorLayoutRecyclerView的直接孩子,因此有适合这种关系的LayoutParamsCoordinatorLayout的孩子很可能有CoordinatorLayout.LayoutParams

但是你不需要使用CoordinatorLayout来实现滑动来删除RecyclerView的动作。它直接支持ItemTouchHelperItemTouchHelper.Callback.onSwiped()回调。


1
投票

给定视图的布局参数旨在由包含布局使用,即父级ViewGroup。因此,当你的CoordinatorLayoutRecyclerView内,它是RecyclerView.LayoutParams

CoordinatorLayout.LayoutParams的观点是@id/simpleModelName,将由CoordinatorLayout布置。

希望这能澄清它。

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