ischecked工作复选框为true / false,但不显示ui复选标记

时间:2019-08-15 14:46:36

标签: java android checkbox

我有一个添加到回收者视图的时区列表。但是,我在活动中的主列表会正确检查,但是当我使用搜索并且列表压缩并且单击复选框时,它不会显示选中标记。但是,在调试中,单击该值时将其设置为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();
            }
        });

1 个答案:

答案 0 :(得分:0)

以下代码块可能始终为真

 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事件内部,因为单击复选框会自动更改状态。

相关问题