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滑动冲突解决办法