【问题标题】:RecyclerView Swipe with a view below not detecting clickRecyclerView 使用下面的视图滑动未检测到点击
【发布时间】: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
  • 你解决了吗?我遇到了同样的问题
  • 你解决了这个问题吗?
  • 有人有解决办法吗?

标签: android android-recyclerview


【解决方案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)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2018-12-30
      • 2015-08-25
      相关资源
      最近更新 更多