【问题标题】:ScrollView inside a RecyclerView androidRecyclerView android中的ScrollView
【发布时间】:2015-04-03 05:45:41
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我不确定这是否可行,但你可以试试这个

    • 在滚动视图被触摸时禁用回收器视图的触摸。
    • 在 recyclerview 触摸上同样禁用滚动视图触摸。

    可以这样实现

    //对于滚动视图

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

    看看这对你有没有帮助。

    【讨论】:

    • 我知道现在要尝试什么让我看看是否可行,我会发布答案谢谢
    【解决方案2】:

    试试这个。

    public class NoInterceptScrollView extends ScrollView {
    
        public NoInterceptScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
    }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            return false;
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      我终于找到了另一种在 RecyclerView viewHolder 中滚动 ScrollView 的方法。作为Ankit Khare's answer,为了这个工作,我们应该在滚动视图被触摸时禁用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)
          }
      }
      

      希望这对查找另一个答案的人有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        相关资源
        最近更新 更多