java - ischecked 工作的复选框 true/false,但不显示 ui 复选标记
问题描述
我有一个添加到回收站视图的时区列表。但是,我在活动中的主列表检查正确,但是当我使用搜索并且列表压缩并且我单击复选框时,它不会显示复选标记。但是,在调试中,单击时该值设置为 true,并且仍会正确地将其添加到回收站视图中。
我曾尝试在网上查找,但没有针对此特定问题的解决方案。
@Override
public void onBindViewHolder(@NonNull final TimezoneViewHolder holder, final int position) {
// Initialize tools
final Timezone_Item currentTimezoneItem = timezoneList.get(position);
int pos = currentTimezoneItem.getId();
final int tzID = --pos;
holder.mChkboxSelect.setText(currentTimezoneItem.getValue());
holder.mUTCCode.setText(currentTimezoneItem.getName());
// This is the solution for... Clicking the checkbox once would select multiple timezones. Not with this.
if(selectedTimezones.get(position)){
holder.mChkboxSelect.setChecked(true);
currentTimezoneItem.setIsSelected(true);
}else{
holder.mChkboxSelect.setChecked(false);
currentTimezoneItem.setIsSelected(false);
}
// Manually activate the clicks in checkbox
holder.mChkboxSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(currentTimezoneItem.getIsSelected()){
currentTimezoneItem.setIsSelected(false);
holder.mChkboxSelect.setChecked(false);
}else {
currentTimezoneItem.setIsSelected(true);
holder.mChkboxSelect.setChecked(true);
}
if(TimezonePickerActivity.isSearching){
selectedTimezones.put(currentTimezoneItem.getId() - 1, currentTimezoneItem.getIsSelected());
}else {
selectedTimezones.put(tzID, currentTimezoneItem.getIsSelected());
}
notifyDataSetChanged();
}
});
}
这是我的搜索过滤器...
private Filter SearchFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence searchText) {
List<Timezone_Item> filteredList = new ArrayList<>();
if (searchText == null || searchText.length() == 0) {
TimezonePickerActivity.isSearching = false;
filteredList.addAll(timezoneListFull);
} else {
String filterPattern = searchText.toString().toLowerCase().trim();
TimezonePickerActivity.isSearching = true;
for (Timezone_Item item : timezoneListFull) {
if (item.getName().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = filteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence searchText, FilterResults results) {
timezoneList.clear();
timezoneList.addAll((List) results.values);
notifyDataSetChanged();
}
};
这是我将所选时区添加到回收站视图中的代码
fabAddTimezone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { SparseBooleanArray selectedTimezones = Timezone_RVAdapter.selectedTimezones;
// Filter out false values
for (int i = 0; i < selectedTimezones.size(); i++) {
if(!selectedTimezones.valueAt(i)){
selectedTimezones.removeAt(i);
selectedTimezones.delete(i);
}
}
// Take filtered values and find its index to grab text and UTC code
for (int i = 0; i < selectedTimezones.size(); i++) {
// Get the position(Key) which is actually the Timezone_Item ID
int position = selectedTimezones.keyAt(i);
// Create new clock item to add into list
Clock_Item clockItem = new Clock_Item(
Timezone_RVAdapter.timezoneListFull.get(position).getName(),
Timezone_RVAdapter.timezoneListFull.get(position).getValue()
);
// Add clock to a list
mClockList.add(clockItem);
}
// Save clock list
sharedPrefs.SaveClockList(mClockList);
// Go back to main menu. Clock list should automatically load once activity boots
finish();
}
});
解决方案
下面的块有可能总是正确的
if(currentTimezoneItem.getIsSelected()){
currentTimezoneItem.setIsSelected(false);
//Calling the below statement is irrelevant inside onClick of itself
//because when inside here checkbox can never be checked
holder.mChkboxSelect.setChecked(false);
}
删除或注释掉调用.setChecked
的每一行语句mChkboxSelect
并允许 android 处理状态。您可以控制复选框的状态,但不能控制它的 onClick 事件,因为单击复选框会自动更改状态。
推荐阅读
- python-3.x - 你能帮我解决hackerrank活跃交易者问题吗?
- pyqt - PyQt在Windows任务栏右键菜单中设置应用图标和应用名称
- tizen - Tizen 原生 UI 动画
- php - 如何在简单的 php 提交表单上实现速率限制?
- apache-camel - Apache Camel:如何将值从配置方法传递到 from() & to() 组件? - [解决]
- swift - 如何从firebase读取所有子数据
- graphql - graphql-mesh:为什么 odata 处理程序在为我的本地端点提供服务时抛出错误
- python - 使用列表理解查找素数
- javascript - Vue.js 兼容 JS 图表,用于指示高低范围之间的值
- php - 仅在 laravel 中打印过滤数据的 pdf