0
내가 CoordinatorLayout을 사용하여 삭제 슬쩍을 구현하려는

에 CoordinatorLayout의 LayoutParams를 가져올 수 없습니다, 그래서 문제가RecyclerView

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 
    } 
} 

RecyclerView

<?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> 

의 항목과 간단한 어댑터에 대한 간단한 XML을 생성 이 줄은 다음과 같습니다.

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을 제공합니까?

답변

2

coordinatorLayoutRecyclerView의 직계 하위 항목이므로이 관계에 적합한 LayoutParams입니다. CoordinatorLayout의 자녀는 CoordinatorLayout.LayoutParams 일 가능성이 큽니다.

RecyclerView으로 작업을 삭제하려면 스 와이프를 구현하는 데 CoordinatorLayout이 필요하지 않습니다. ItemTouchHelperItemTouchHelper.Callback.onSwiped() 콜백으로 직접 지원됩니다.

+0

일반적으로 ItemTouchHelper를 사용하지만 CoordinatorLayout과 함께 작동하는지 확인하고 싶습니다. 부모보기를 사용하려고합니다. – DEADMC

+0

그런 다음'nameTextView' 뷰를 직접 사용해보십시오. 그러면 '스 와이프'동작이 있어야한다고 생각합니다. 올바른 'LayoutParams'가 있어야합니다. – tynn

+0

방금 ​​추가 레이아웃으로 포장했습니다. 그리고 그게 효과가있어, 고마워. – DEADMC

1

주어진보기의 레이아웃 매개 변수는 포함 레이아웃 (즉, 부모 ViewGroup)에서 사용하기위한 매개 변수입니다. 따라서 CoordinatorLayoutRecyclerView 안에 있으며 RecyclerView.LayoutParams입니다.

CoordinatorLayout.LayoutParams을 갖는 뷰는 @id/simpleModelName이고, 이는 CoordinatorLayout으로 표시됩니다.

희망 사항.