在RecyclerView中访问OnBindViewHolder中的所有持有者视图



单击任何一个卡后,我需要将回收器视图中所有卡(使用回收器视图适配器类(的可单击属性设置为 false。我该怎么做?设置 holder.cardView.setClickable(false( 只对点击的人这样做。如何访问OnBindViewHolder视图中的所有卡?

由于延迟加载子视图的方式RecyclerView您无法执行此操作。仅当子视图在屏幕上可见时,才会创建和呈现子视图,其他视图将被清除以节省内存。

您可以执行以下操作以获得相同的效果:

1/在RecyclerView上创建一个叠加FrameLayout,将其clickable设置为 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);
})

2/创建一个boolean preventClick变量,当您想要阻止用户点击时将其设置为 true。然后在项目的 OnClickListener 中检查此值。

我的想法是:

在适配器类中定义:

public static SparseBooleanArray itemCardClickState = new SparseBooleanArray();
private int currentPlayingPosition = -1;

并在您的视图持有人类中:

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 - 将您的项目单击侦听器带到带有界面的活动。将此代码添加到回收器视图适配器

private RecyclerViewItemClickListener recyclerViewItemClickListener;
public void setRecyclerViewItemClickListener(RecyclerViewItemClickListener recyclerViewItemClickListener) {
this.recyclerViewItemClickListener = recyclerViewItemClickListener;
}
public interface RecyclerViewItemClickListener {
void onClick(View v);
}

步骤 2 - 在视图持有人中为您的项目制作单击侦听器,而不是在绑定视图持有人中

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);
}
});
}
}

在您的活动中,使用界面设置点击侦听器,并在点击时再次使用空白代码覆盖它。

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) {
}
});
}
});

我测试了它,它可以按照您想要的方式工作

在适配器中声明一个Integer变量,并为其分配启用定位视图的相应位置,并比较bindItem中的值并启用,禁用 根据。还要确保在单击时呼叫notifyDataSetChanged()

最新更新