java - 如何禁用 RecyclerView 和 AsyncTask 中的按钮

标签 java android button android-recyclerview android-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 的地方。

最佳答案

发生这种情况是因为回收器 View 回收(顾名思义)您可见的 View ,并为导致此问题的每组项目提供相同的 ID 集。

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

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

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

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

2) 使用 POJO 类:-

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

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

关于java - 如何禁用 RecyclerView 和 AsyncTask 中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57397181/

相关文章:

java - Java AudioSystem.getAudioFileTypes()在android中返回空数组

android - 如何用 firebase 替换 quickblox 服务

angularjs - 如何禁用 ANGULARJS 中的按钮

java - XPath 中的 XML 子位置与文档位置

java - 将 hadoop 连接到 neo4j

java - mapreduce 二次排序不起作用

android - 我试图在 ionic 中添加 android 平台但它不起作用,它显示错误

android - iOS 中是否有与 Android ProgressDialog 等效的东西

javascript - 如何在 JavaScript 中触发按钮单击 Enter

swift - 如何让一个按钮消失并快速替换为另一个按钮?