为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 RecyclerView 和 AsyncTask 中禁用按钮

如何在 RecyclerView 和 AsyncTask 中禁用按钮

慕村9548890 2023-05-24 15:33:05
在 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。
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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


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


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


     @Override

public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {

    myViewHolder.setIsRecyclable(false);

}

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


2) 使用 POJO 类:-


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


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


查看完整回答
反对 回复 2023-05-24
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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

list[position].willPositiveDisplay = false;

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


查看完整回答
反对 回复 2023-05-24
  • 2 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信