我试图在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/