Child RecyclerView不会在内部滚动

时间:2019-07-09 15:09:52

标签: java android kotlin android-recyclerview nestedrecyclerview

我是Android应用开发的新手。好吧,我正在玩RecyclerView。我有一个模态布局的父recyclerview。现在,模态布局具有一个recyclerview(子recyclerview)。我设法创建了适配器并滚动了主recyclerview的列表。不幸的是,我找不到滚动子recyclerview的方法。这是我正在玩的代码:

  1. 我已经尝试在父级recyclerview适配器的onBindViewHolder方法中设置子级recyclerview的适配器。

  2. 我还尝试为子recyclerView设置属性nestedScrollingEnabled = true,descantantFocusability = blockDescendants和focusableInTouchMode = true。

这是我的 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

家长recyclerview模型(model.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="Testing" />

    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray"
        android:layout_marginVertical="8dp"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/modalRecyclerView"
        android:layout_width="wrap_content"
        android:layout_height="100dp" />
</LinearLayout>

子回收站视图模型(child_modal.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Testing"/>
</LinearLayout>

在MainActivity中:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        recyclerView.apply {
            layoutManager = LinearLayoutManager(this@MainActivity, RecyclerView.VERTICAL, false)
            adapter = ModalAdapter()
        }
    }

ModalAdapter:

class ModalAdapter : RecyclerView.Adapter<ModalAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(parent.context).inflate(R.layout.model, parent, false)
        return ViewHolder(inflater)
    }

    override fun getItemCount(): Int {
        return 5
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.view.modalRecyclerView.adapter = ChildModalAdapter()
        holder.view.modalRecyclerView.layoutManager = LinearLayoutManager(holder.view.context, RecyclerView.VERTICAL, false)
    }

    class ViewHolder(val view: View): RecyclerView.ViewHolder(view)
}

ChildModalAdapter:

class ChildModalAdapter : RecyclerView.Adapter<ChildModalAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(parent.context).inflate(R.layout.child_modal, parent, false)
        return ViewHolder(inflater)
    }

    override fun getItemCount(): Int {
        return 10
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    }

    class ViewHolder(val view: View): RecyclerView.ViewHolder(view)
}

当父recyclerview滚动正常时,内部recyclerview不滚动。我正在尝试找到一种方法来使内部recyclerview与父recyclerview一起滚动(我希望两个recyclerview一起滚动)。

1 个答案:

答案 0 :(得分:0)

好的,我通过设置 DisallowInterceptTouchEvent 来解决此问题。

下面是修复该问题的代码:

val mScrollChangeListener = object : RecyclerView.OnItemTouchListener {
        override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}

        override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
            when (e.action) {
                MotionEvent.ACTION_MOVE -> {
                    rv.parent.requestDisallowInterceptTouchEvent(true)
                }
            }
            return false
        }

        override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
    }
    modalRecyclerView.addOnItemTouchListener(mScrollChangeListener)

我已将此代码添加到父RecyclerView适配器的 onBindViewHolder()中。