猿问

如何在 RecyclerView 和 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。


慕村9548890
浏览 173回答 2
2回答

MMMHUHU

当回收器视图回收(顾名思义)您可见的视图并为导致此问题的每组项目提供相同的一组 id 时,就会发生这种情况。这个问题有 2 个解决方案:1)停止recyclerview的回收行为如下:-&nbsp; &nbsp; &nbsp;@Overridepublic void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {&nbsp; &nbsp; myViewHolder.setIsRecyclable(false);}但我强烈拒绝使用这个,因为回收是我们使用 recyclerview 的原因。2) 使用 POJO 类:-最好的解决方案是使用一个 POJO 类,它有两个变量,第一个是值,第二个是布尔变量,它显示项目是否禁用。对于您要禁用的项目,将 POJO 布尔变量的值设置为 true,并在 onBindViewHolder 方法中仅禁用在布尔变量中设置为 false 的项目的按钮。如果您仍然感到困惑,请联系我,我会给您发送一个示例。

阿波罗的战车

您需要保持这些按钮的状态。您可以在填充 recyclerview 的列表的项目(例如 等)中保存状态isNegativeEnabled。willPositiveDisplay当您单击肯定按钮时,更改willPositiveDisplay为 false。list[position].willPositiveDisplay&nbsp;=&nbsp;false;list[position].willPositiveDisplay如果没有设置为消失,则检查是否为真,将可见性设置为可见。并为否定按钮执行此操作。
随时随地看视频慕课网APP

相关分类

Java
我要回答