RecyclerView 使用下面的视图滑动未检测到点击

Posted

技术标签:

【中文标题】RecyclerView 使用下面的视图滑动未检测到点击【英文标题】:RecyclerView Swipe with a view below not detecting click 【发布时间】:2017-01-04 11:25:19 【问题描述】:

我有一个像这样的RecyclerView 行布局

<Layout>
    <BackgroundView>        
    <ForegroundView>
</Layout>

我正在使用ItemTouchHelper 来处理前景视图上的滑动(部分),例如

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) 
    adapter.onItemSwiped(viewHolder);


@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                        float dX, float dY, int actionState, boolean isCurrentlyActive) 

    View foregroundView = ((myViewHolder)viewHolder).getForegroundView();
    getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY, actionState, isCurrentlyActive);

    //getSwipeLimit() used below returns the width of the delete icon
    float translationX = Math.min(-dX, ((myViewHolder) viewHolder).getSwipeLimit());
    foregroundView.setTranslationX(-translationX);

我在我的适配器类的BindViewHolder 中为背景视图设置了一个点击监听器。

@Override
public void onBindViewHolder(WhiteListViewHolder holder, Cursor cursor) 
    //get name and number from the cursor here

    holder.name.setText(name);
    holder.number.setText(number);

    holder.deleteButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Log.d("whitelist", "yes clicked");
        
    );

问题是,当视图未滑动时,背景视图正在接受点击,但在视图被刷出后,背景视图停止接受点击。

参考上图,如果我点击删除按钮,滑动视图有时会恢复,它不会捕获点击。

如果我让整个视图滑出,单击左侧的空白区域也会带回滑过的视图。

提前致谢。

【问题讨论】:

能否请您在 Github 上分享您的项目,以便我尝试一下? @ReazMurshed 你可以在这里找到项目:github.com/amk47/testproject 你解决了吗?我遇到了同样的问题 你解决了这个问题吗? 有人有解决办法吗? 【参考方案1】:

我解决了任务的第一部分 - 现在没有滑动就检测不到。 但是滑动后点击不检测...

 @Override
 public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) 
   if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE)
     if (dX < 0) 
         backgroundView.setVisibility(View.VISIBLE);
     
     else 
         backgroundView.setVisibility(View.GONE);
     
   
 

【讨论】:

【参考方案2】:

ItemTouchHelper 也有同样的问题。在onSwiped(..) 中调用adapter.notifyDataSetChanged() 为我解决了这个问题。

ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, LEFT) 
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean = false

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) 
            //calling my listeners here

            recycler_view.adapter?.notifyDataSetChanged()
        

        override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) 
            if (viewHolder != null) 
                getDefaultUIUtil().onSelected(viewHolder.itemView.view_foreground)
            
        

        override fun onChildDrawOver(
            c: Canvas,
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder?,
            dX: Float,
            dY: Float,
            actionState: Int,
            isCurrentlyActive: Boolean
        ) 
            if (dX < 0 && viewHolder != null) 
                getDefaultUIUtil().onDrawOver(
                    c,
                    recyclerView,
                    viewHolder.itemView.view_foreground,
                    dX,
                    dY,
                    actionState,
                    isCurrentlyActive
                )
            
        

        override fun onChildDraw(
            c: Canvas,
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            dX: Float,
            dY: Float,
            actionState: Int,
            isCurrentlyActive: Boolean
        ) 
            if (dX < 0) 
                getDefaultUIUtil().onDraw(
                    c,
                    recyclerView,
                    viewHolder.itemView.view_foreground,
                    dX,
                    dY,
                    actionState,
                    isCurrentlyActive
                )
            
        
    ).also 
        it.attachToRecyclerView(recycler_view)
    

【讨论】:

以上是关于RecyclerView 使用下面的视图滑动未检测到点击的主要内容,如果未能解决你的问题,请参考以下文章

视图未检测到滑动图像库的手势识别器

RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)

使用 ItemTouchHelper 在 recyclerView 中滑动到另一个视图

ViewPager2嵌套RecyclerView滑动冲突解决办法

RecycleViewScrollHelper--RecyclerView滑动事件检测的辅助类

如何获取Android RecyclerView滑动的距离