您当前的位置: 首页 > 

蓝不蓝编程

暂无认证

  • 1浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

RecyclerView嵌套(含滑动冲突解决,在子控件中解决冲突)

蓝不蓝编程 发布时间:2019-08-26 15:10:45 ,浏览量:1

背景

有时需要在纵向滑动列表中嵌套横向滑动列表. 效果图: image

解决方案

通过纵向RecyclerView嵌套横向RecyclerView. 大致实现方式:

  1. 主界面中包含一个纵向RecyclerView

  1. 纵向RecyclerView的adapter
  • VerticalRvAdapter.kt
class VerticalRvAdapter : RecyclerView.Adapter() {
    private var mDataList = mutableListOf()
    private lateinit var mContext: Context
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val data = mDataList[position]
        val horizontalRvAdapter = HorizontalRvAdapter()
        holder.itemView.horizontalRecyclerView.adapter = horizontalRvAdapter
        horizontalRvAdapter.setData(data)
    }

    fun setData(dataList: List) {
        mDataList.clear()
        mDataList.addAll(dataList)
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int = mDataList.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        mContext = parent.context
        val view = LayoutInflater.from(mContext).inflate(R.layout.item_vertical_rv, parent, false)
        view.horizontalRecyclerView.layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false)

        return ViewHolder(view)
    }

    class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!)

}
  • 纵向RecyclerView每个item对应的布局item_vertical_rv.xml(包含一个横向RecyclerView ):

  1. 横向RecyclerView(HorizontalRecyclerView.kt): 作用: 解决滑动冲突,具体多大角度进行纵向滑动,多大角度进行横向滑动,可以通过修改if (abs(moveX - mDownX) > abs(moveY - mDownY))实现.(此处为了代码简洁,为直接计算出角度,而是采用宽和高的比较来达到同样效果)
class HorizontalRecyclerView(context: Context, attrs: AttributeSet) : RecyclerView(context, attrs) {

    private var mDownX: Int = 0
    private var mDownY: Int = 0

    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        when (ev.action) {
            MotionEvent.ACTION_DOWN -> {
                mDownX = ev.x.toInt()
                mDownY = ev.y.toInt()
            }
            MotionEvent.ACTION_MOVE -> {
                val moveX = ev.x.toInt()
                val moveY = ev.y.toInt()
                if (abs(moveX - mDownX) > abs(moveY - mDownY)) {
                    parent.requestDisallowInterceptTouchEvent(true)
                }
                mDownX = moveX
                mDownY = moveY
            }
        }
        return super.dispatchTouchEvent(ev)
    }
}
关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0384s