如何在 RecyclerView 和 AsyncTask 中禁用按钮

How to disable button in RecyclerView and from AsyncTask

我试图在 Retrofit 响应中单击 RecyclerView 后禁用按钮。

应用程序正在使用 RecyclerView 填充列表,我正在使用 Retrofit 与后端 REST 进行通信 API。一个项目中有两个按钮,单击时激活 Retrofit 客户端。如果 API 的响应成功,则应禁用按钮。我遇到了两个问题: 前几个项目工作得很好,但经过几次我从未点击过的滚动按钮也被禁用了; 其次是列表中后面的几个随机按钮仍然可以点击。

    public void onBindViewHolder(final NewsViewHolder holder, int position) {
        holder.btnPositive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//              init Retrofit Client
                JSONPlaceHolderAPI mAPIService;
                mAPIService = ApiUtils.getAPIServiceFetch();
                mAPIService.getNews(url).enqueue(new Callback<Result>() {
                    @Override
                    public void onResponse(Call<Result> call, Response<Result> 
                                           response) {
                            holder.btnPositive.setVisibility(View.GONE);
                        }
                    }
                    @Override
                    public void onFailure(Call<Result> call, Throwable t) {
//                      do code
                    }
                });

            }
        });
        holder.btnNegative.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JSONPlaceHolderAPI mAPIService;
                mAPIService = ApiUtils.getAPIServiceFetch();
                mAPIService.getNews(url).enqueue(new Callback<Result>() {
                    @Override
                    public void onResponse(Call<Result> call, Response<Result> 
                                           response) {
                            holder.btnNegative.setEnabled(false);
                        }
                    }
                    @Override
                    public void onFailure(Call<Result> call, Throwable t) {
                    // do code
                    }
                });

            }
        });
    }

我想问题出在 Retrofit 的某个地方,它使用后台线程或 AsyncTask。

您需要保持这些按钮的状态。您可以在填充 recyclerview 的列表的项目(例如 isNegativeEnabledwillPositiveDisplay 等)中保存状态。单击肯定按钮时,将 willPositiveDisplay 更改为 false。

list[position].willPositiveDisplay = false;

并检查 list[position].willPositiveDisplay 是否为真将可见性设置为可见,如果未设置为消失。并为否定按钮执行此操作。

当回收器视图回收(顾名思义)您可见的视图并为导致此问题的每组项目提供相同的 id 集时,就会发生这种情况。

这个问题有2个解决方案:

1)停止recyclerview的回收行为如下:-

     @Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
    myViewHolder.setIsRecyclable(false);
}

但我强烈拒绝使用这个,因为回收是我们使用 recyclerview 的原因。

2) 使用 POJO Class:-

最好的解决方案是使用 POJO class,它有两个变量,第一个是值,第二个是布尔变量,它显示项目是否禁用。对于您要禁用的项目,将 POJO 布尔变量的值设置为 true,并在 onBindViewHolder 方法中仅禁用在布尔变量中设置为 false 的项目的按钮。

如果您仍然感到困惑,请与我联系,我会向您发送示例。