如何使RecyclerView的项不可点击?

9
我尝试了以下代码:
view.setEnabled(false);
myReqRecyclerView.setEnabled(false);

第一行禁用了当前被点击的视图。在单击后,我希望将所有项目设为不可点击,以免发生双击。 似乎第二行代码并没有起作用。

https://dev59.com/Q4bca4cB1Zd3GeqPbd5B#27977229 - Access Denied
你解决了吗? - user924
5个回答

2
您可以通过重写下面的方法并返回true来防止对viewGroup子项进行触摸:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return true;
}

2

第一个简单的选项

但实际上很糟糕的是使用系统时间:

 long mLastClickTime = 0;

    youradapter.setOnItemClickListener(new youradapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {

            if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
                return;
            }
            mLastClickTime = SystemClock.elapsedRealtime();

            ....//your code


        }
    });

但是为了编写清晰的程序,我建议这样做:

有些棘手但很简单

在您的适配器中引入一个布尔变量,请注意viewHolder()和onBindViewHolder()方法:

private boolean clickable = true;


@Override
public void onBindViewHolder(@NonNull myAdapter.ViewHolder viewHolder, int position) {

    if (!clickable){
        viewHolder.cardView.setClickable(false);
    } else {
        viewHolder.cardView.setClickable(true);
    }

    //....
}

public void setClickable(boolean clickable) {
    this.clickable = clickable;
    myadapter.notifyDataSetChanged();
}

public static class ViewHolder extends RecyclerView.ViewHolder {

    CardView cardView;

    public ViewHolder(View itemView, final myViewHolder.OnItemClickListener listener){
        super(itemView);
        //..

        cardView = itemView.findViewById(R.id.cardView);

        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(position);
                    }
                }
            }
        });
    }
}

您可以根据需要使用myadapter.setClickable(state)。

像这样:

    youradapter.setOnItemClickListener(new youradapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {

            myadapter.setClickable(false);

            ....//your code


        }
    });

也许在您的onResume()方法中:

 myadapter.setClickable(true);

1

在你不想被点击的视图上尝试使用view.setClickable(false);


2
我想要完成recycler view的非可点击状态,但是view.setClickable(false);对此无效。 - Ritz
@Override public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.nfn_row_item, viewGroup, false);view.setClickable(false); return new CustomViewHolder(view); } - Sagar Pujari
我想要一个选项来使所有项目都不可点击,但你建议将所有项目的 clickable 属性设置为 false。 - user924

0
在您的recyclerView适配器中,您将拥有以下类似的方法:
@Override
public YourViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View partnerTypeView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
    return new YourViewHolder(partnerTypeView);
}

将以下行添加到其中:

    @Override
    public YourViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View partnerTypeView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
        partnerTypeView.setClickable(false);//This is line that make row non clickable
        return new YourViewHolder(partnerTypeView);
    }

如果这个不起作用,请在下面评论。

1
谢谢回复,这将禁用所有项目,但我只想在单击一个项目后整个RecyclerView被禁用。 - Ritz

0

让列表项从适配器的代码中继承父级的enabled参数:

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
    view.setEnabled(parent.isEnabled());
    return new MyViewHolder(view);
}

然后你所要做的就是设置列表本身的值并再次设置适配器:

recyclerView.setEnabled(false);
recyclerView.setAdapter(adapter);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接