Java 在RecyclerView中访问OnBindViewHolder中的所有holder视图
我需要在单击任何一张卡后,将recycler视图(使用RecyclerView适配器类)中所有卡的Clickable属性设置为false。我该怎么做?设置holder.cardView.setClickable(false)仅对单击的一个进行设置。如何在OnBindViewHolder中访问视图中的所有卡?由于Java 在RecyclerView中访问OnBindViewHolder中的所有holder视图,java,android,Java,Android,我需要在单击任何一张卡后,将recycler视图(使用RecyclerView适配器类)中所有卡的Clickable属性设置为false。我该怎么做?设置holder.cardView.setClickable(false)仅对单击的一个进行设置。如何在OnBindViewHolder中访问视图中的所有卡?由于RecyclerView延迟加载子视图的方式,您无法访问这些卡。仅当子视图在屏幕上可见时,才会创建和渲染它们,其他视图会被清除以节省内存 您可以执行以下操作以获得相同的效果: 1/在您的回
RecyclerView
延迟加载子视图的方式,您无法访问这些卡。仅当子视图在屏幕上可见时,才会创建和渲染它们,其他视图会被清除以节省内存
您可以执行以下操作以获得相同的效果:
1/在您的回收视图
上创建一个覆盖框架布局
,将其可点击
设置为true,然后在需要时显示/隐藏它以防止触摸
<FrameLayout>
<RecyclerView ... />
<FrameLayout
android:id="@+id/overlay_view"
...
android:clickable="true" />
</FrameLayout>
cardItem.setOnClickListener(view -> {
// The mOverlayView will intercept all the touch event on RecyclerView
mOverlayView.setVisibility(View.VISIBLE);
})
cardItem.setOnClickListener(视图->{
//mOverlayView将拦截RecyclerView上的所有触摸事件
设置可见性(View.VISIBLE);
})
2/创建一个boolean preventClick
变量,当您想要阻止用户单击时,将其设置为true。然后在项目的OnClickListener中检查此值。我的想法是:
在适配器类中定义:
public static SparseBooleanArray itemCardClickState = new SparseBooleanArray();
private int currentPlayingPosition = -1;
在viewHolder类中:
myCardItem..setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
int prev = currentPlayingPosition;
currentPlayingPosition = position;
if (prev >= 0)
notifyItemChanged(prev);
// refresh previously clicked item view
itemCardClickState .put(currentPlayingPosition, true);
}
});
并检查onBinViewHoldee中的卡状态是否为真我发现一个很长的过程可以用干净的代码解决您的问题 步骤1-将您的项目单击侦听器带到带有界面的活动。将此代码添加到您的RecyclerView适配器
private RecyclerViewItemClickListener recyclerViewItemClickListener;
public void setRecyclerViewItemClickListener(RecyclerViewItemClickListener recyclerViewItemClickListener) {
this.recyclerViewItemClickListener = recyclerViewItemClickListener;
}
public interface RecyclerViewItemClickListener {
void onClick(View v);
}
步骤2-在ViewHolder中,而不是在onBindViewHolder中,为您的项目创建单击侦听器
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View view) {
super(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recyclerViewItemClickListener.onClick(v);
}
});
}
}
在活动中,使用界面设置click listener,然后再次单击并使用空代码覆盖它
adapter.setRecyclerViewItemClickListener(new RecyclerViewAdapter.RecyclerViewItemClickListener() {
@Override
public void onClick(View v) {
//do everything that should happen on click
//then set a blank click listener
adapter.setRecyclerViewItemClickListener(new RecyclerViewAdapter.RecyclerViewItemClickListener() {
@Override
public void onClick(View v) {
}
});
}
});
我对它进行了测试,它可以按照您的要求工作,在适配器中声明一个
整数
变量,并指定启用定位视图的相应位置,比较bindItem
中的值,并根据需要启用、禁用。另外,请确保在单击时调用notifyDataSetChanged()
。是的,我只希望当前视图中的现有子卡不可单击,例如,我一次可以看到4张卡,因此如果我单击其中任何一张卡以避免双击,则所有卡都应不可单击您要阻止单击当前可见的项目,但若用户向下滚动一点,可见项将发生变化,然后单击其中一个。我可能理解你错了,但以上方法是我将要做的。如果在单击任何卡时使其可见,则覆盖视图将拦截所有单击