如何在 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 的列表的项目(例如 isNegativeEnabled
、willPositiveDisplay
等)中保存状态。单击肯定按钮时,将 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 的项目的按钮。
如果您仍然感到困惑,请与我联系,我会向您发送示例。
我试图在 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 的列表的项目(例如 isNegativeEnabled
、willPositiveDisplay
等)中保存状态。单击肯定按钮时,将 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 的项目的按钮。
如果您仍然感到困惑,请与我联系,我会向您发送示例。