java - 在回收 View 中执行过滤时,屏幕上的数据显示不正确

标签 java android filter android-recyclerview

描述:

我有一个 Android 应用程序,在其中一个部分用户可以选择他的技能,例如 https://stackoverflow.com 中的标签。

enter image description here

因此,当用户点击加号按钮时,他可以看到所有可用的技能并选择 他想要什么 enter image description here

如您所见,屏幕顶部有一个过滤器,用于查找用户想要添加的技能。问题来了,它有很多影响

例如,如果我输入“Eng”来查找“English”,结果将是“Spanish” enter image description here

别急着告诉我,问题出在过滤算法上,因为 我的控制台记录,结果是正确的,并且过滤器只找到“英语” 更重要的是,如果我选择此选项,正确答案“英语”将显示在“西类牙语”下方 enter image description here

更重要的是,如果我保存更改,在我的帐户中显示我实际上选择“英语” You can see the difference between fist screenshoot and this

所以过滤是正确的,并且保存数据是正确的,问题在于显示技能名称。为什么我称它为魔法?因为控制台在显示结果之前记录了正确的名称

而且我注意到,如果我返回完整的技能列表,它也会显示错误

enter image description here

但与之前的情况一样,我的控制台日志显示,一切正常,并且我有正常的技能列表,没有重复

这是我的代码示例:

搜索 - 是简单的 EditText 字段

search.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            chipAdapter.getFilter().filter(charSequence);
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });

适配器:

@Override
public void onBindViewHolder(final ChipAdapterAllSkills.ChipViewHolder holder, final int position) {

    String skill = filtredSkillList.get(position).getName();
    System.err.println("SKILL "+skill+" position "+position);
    holder.skillChip.setChipText(skill);
    holder.skillChip.setSelectable(true);
    holder.skillChip.setSelected(true);
    holder.skillChip.setTextColor(MainAplication.getContext().getResources().getColor(R.color.accent));
    holder.skillChip.changeBackgroundColor(MainAplication.getContext().getResources().getColor(R.color.blue));
    holder.skillChip.setOnSelectClickListener(new OnSelectClickListener() {
        @Override
        public void onSelectClick(View v, boolean selected) {

            System.err.println(selected);
            if(!selected) {
                SelectSkills.getSkillsToAdd().add(filtredSkillList.get(position));
            }else {
                SelectSkills.getSkillsToAdd().remove(filtredSkillList.get(position));
            }
        }
    });
}

@Override
public int getItemCount() {
    return  filtredSkillList.size();
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {

            String target = charSequence.toString();
            if (target.isEmpty()) {
                filtredSkillList = skillList;
            } else {
                List<Skill> list = new ArrayList<>();
                for (Skill s : skillList) {
                    if (s.getName().toLowerCase().contains(target.toLowerCase())) {
                        list.add(s);
                        System.err.println(s.getName());
                    }
                }
                filtredSkillList = list;
            }
            FilterResults results = new FilterResults();
            results.values = filtredSkillList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            filtredSkillList = (ArrayList<Skill>) filterResults.values;
            notifyDataSetChanged();

        }
    };
}

我真的不知道发生了什么,也许你们中的一些人可以帮忙)

我怀疑问题可能出在线程中,但我没有在这段代码中对它们进行任何更改

最佳答案

问题不在我的代码中。 我用来创建技能芯片的库中有一些问题。

因为与其他库一起工作都很好)

关于java - 在回收 View 中执行过滤时,屏幕上的数据显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48850421/

相关文章:

java - Java有毕达哥拉斯定理吗?

java - 在 "for each"java中获取引用

java - 为什么这个变量已经初始化为空字符串,却设置为空字符串?

filter - 电源 BI/DAX : Filter SUMMARIZE or GROUPBY by added column value

python - 使用多个键之一过滤字典

mysql - 使用多对多表 MySQL 进行过滤

java - ListActivity 的 Runnable 无限循环

java - Storm 拓扑的 bolt 接收重复结果

android - 在 YouTube API V3 Android 中检索热门视频

php - 如何使用 php 主机/服务器在两个 android 设备之间部署连接