Java 在RecyclerView中访问OnBindViewHolder中的所有holder视图

Java 在RecyclerView中访问OnBindViewHolder中的所有holder视图,java,android,Java,Android,我需要在单击任何一张卡后,将recycler视图(使用RecyclerView适配器类)中所有卡的Clickable属性设置为false。我该怎么做?设置holder.cardView.setClickable(false)仅对单击的一个进行设置。如何在OnBindViewHolder中访问视图中的所有卡?由于RecyclerView延迟加载子视图的方式,您无法访问这些卡。仅当子视图在屏幕上可见时,才会创建和渲染它们,其他视图会被清除以节省内存 您可以执行以下操作以获得相同的效果: 1/在您的回

我需要在单击任何一张卡后,将recycler视图(使用RecyclerView适配器类)中所有卡的Clickable属性设置为false。我该怎么做?设置holder.cardView.setClickable(false)仅对单击的一个进行设置。如何在OnBindViewHolder中访问视图中的所有卡?

由于
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张卡,因此如果我单击其中任何一张卡以避免双击,则所有卡都应不可单击您要阻止单击当前可见的项目,但若用户向下滚动一点,可见项将发生变化,然后单击其中一个。我可能理解你错了,但以上方法是我将要做的。如果在单击任何卡时使其可见,则覆盖视图将拦截所有单击