在RecyclerView android里面的ScrollView

时间:2015-04-03 05:45:41

标签: android android-recyclerview android-scrollview android-cardview

我目前正在使用recyclerView和卡片。

我有卡片布局。现在我想在卡片中添加scrollview是可能的。如果是,那怎么样? 棕色布局是回收器视图布局,而蓝色布局是卡片布局。在每张卡片里面我需要滚动视图吗?

enter image description here

3 个答案:

答案 0 :(得分:7)

我不确定这是否有用,但您可以试试这个

  • 触摸滚动视图时,禁用触摸回收器视图。
  • 同样,在recyclerview touch上禁用scrollview touch。

这可以像这样实现

//对于scrollView

   scrollView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                     // Disallow the touch request for parent scroll on touch of child view
                    view.getParent().requestDisallowInterceptTouchEvent(false);
                    return true;
                }
            }); 

看看这对你有帮助。

答案 1 :(得分:0)

试试这个。

public class NoInterceptScrollView extends ScrollView {

    public NoInterceptScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
}

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
}

}

答案 2 :(得分:0)

我终于找到了另一种在 RecyclerView viewHolder 中滚动 ScrollView 的方法。作为Ankit Khare's answer,为了实现这一点,我们应该在触摸ScrollView时禁用RecyclerView的触摸,但他的解决方案太简单了,我尝试后效果不佳。是的,我知道问题和答案都是 6 年前发布的,也许当时它有效,但现在我尝试后不再有效。

这是我的分析。我们应该禁用它的滚动机制,而不是禁用 RecyclerView 的触摸。为了可以禁用 RecyclerView 的滚动,我们应该使用 LayoutManager 中用于 RecyclerView 的函数 canScrollVertically()。然后,在 RecyclerView 的适配器中,我为 ScrollView 实现了 onTouchListener() 以触发对其的触摸并禁用或启用 RecyclerView。所以,这是我的示例代码(我使用的是 Kotlin):

class MyActivity : AppCompatActivity(), MyAdapter.AdapterListener {
    private var isVerticalScrollEnabled = true

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
   
        /* Set RecyclerView adapter here */
        recyclerView.apply {
            layoutManager = object : LinearLayoutManager(this@MyActivity) {
                override fun canScrollVertically(): Boolean {
                    return isVerticalScrollEnabled 
                }
            }
            adapter = MyAdapter(callback = this@MyActivity)
        }
    }

    /**
     * Callback from MyAdapter.AdapterListener.
     */
    override fun onScrollViewTouched(isTouched: Boolean) {
        isVerticalScrollEnabled = !isTouched
    }
}

class MyAdapter internal constructor(private val callback: AdapterListener) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) {
        /* set touch listener for scrollview */
        scrollView.setOnTouchListener(object : View.OnTouchListener {
            override fun onTouch(v: View?, event: MotionEvent?): Boolean {
                return when (event?.action) {
                    MotionEvent.ACTION_DOWN -> {
                        callback.onScrollViewTouched(isTouched = true)
                        true
                    }
                    MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                        callback.onScrollViewTouched(isTouched = false)
                        true
                    }
                    else -> {
                        /* return false so that scrollview can scroll the content */
                        false
                    }
                }
            }
        })
    }

    internal interface AdapterListener {
        fun onScrollViewTouched(isTouched: Boolean)
    }
}

希望这对查找其他答案的人有所帮助。