【问题标题】:CustomArrayAdapter doesn't refresh after filter text has been removed删除过滤器文本后,CustomArrayAdapter 不刷新
【发布时间】:2023-04-02 23:43:01
【问题描述】:

大家好,我已经实现了自己的 ArrayAdapter,因为我在单个 ListView 项中有两个文本视图。 虽然过滤工作正常(它显示正确的项目),但当我删除我为过滤项目而键入的文本时,ListView 不会进入其初始状态(它不会显示所有项目),而是离开过滤后的列表不变。 这是我的过滤器实现:

private class NightFilter extends Filter {

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        items = (ArrayList<NightOut>) results.values;
        clear();
        int count = items.size();
        for (int i = 0; i < count; i++) {
            NightOut pkmn = (NightOut) items.get(i);
            add(pkmn);
        }
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults result = new FilterResults();
        if (constraint == null || constraint.length() == 0) {
            ArrayList<NightOut> list = new ArrayList<NightOut>(nightsOut);
            result.values = list;
            result.count = list.size();
        } else {
            final ArrayList<NightOut> list = new ArrayList<NightOut>(nightsOut);
            final ArrayList<NightOut> nlist = new ArrayList<NightOut>();
            int count = list.size();

            for (int i = 0; i < count; i++) {
                final NightOut nightOut = list.get(i);
                final String value = nightOut.getAddress().toLowerCase();

                if (value.contains(constraint.toString().toLowerCase())) {
                    nlist.add(nightOut);
                }
            }
            result.values = nlist;
            result.count = nlist.size();
        }
        return result;

    }
}

nightsOut 和 items 都包含我想要过滤的对象(我在构造函数中分配了这些对象)。如果有任何帮助,我的自定义适配器类将扩展 ArrayAdapter。

编辑:

为构造函数和文本过滤添加代码

    public CustomArrayAdapter(Activity context, ArrayList<NightOut> nightsOut) {
    super(context, R.layout.list_item, nightsOut);
    this.context = context;
    this.nightsOut = nightsOut;
    this.items = nightsOut;
}

搜索方式

        inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            ViewPlacesActivity.this.adapter.getFilter().filter(cs);
        }

知道我错过了什么吗?

凯尔干杯

【问题讨论】:

  • 你的搜索方法代码在哪里?
  • 什么意思?我在 performFiltering 方法中进行过滤。搜索非常简单我添加了一个侦听器到 edittext 和 ontextchanged 方法我执行过滤器,如:Activity.this.adapter.getFilter.filter(cs)
  • 您的搜索/编辑文本视图输入的查询文本。
  • 就像我说的 ontextchanged 我称之为 Activity.this.adapter.getFilter.filter(cs),cs 是输入的字符序列
  • 不说了,展示一下。也许你在那里做错了什么..

标签: android listview android-arrayadapter android-filter


【解决方案1】:

您使用nightsOut 作为ArrayAdapter 的源列表以及过滤器的源列表的方式是导致问题的原因。

publishResults() 方法中,您调用了clear(),它从ArrayAdapter 内的nightsOut 列表中删除所有元素,因为这是它引用的列表。然后,您只读取过滤后的数据。

那么下次调用performFiltering() 时,您将再次使用nightsOut 作为源列表,其中仅包含过滤后的项目。

您想要做的是保留对原始项目的引用。您实际上并不需要 items 目前使用的方式,因此我将其重命名为 originalItems 并执行以下操作:

public CustomArrayAdapter(Activity context, ArrayList<NightOut> nightsOut) {
    super(context, R.layout.list_item, nightsOut);
    this.context = context;
    this.nightsOut = nightsOut;
    originalItems = new ArrayList<>(nightsOut); // create a copy of nightsOut.
}

然后是过滤器

private class NightFilter extends Filter {

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        ArrayList<NightOut> tempList = (ArrayList<NightOut>) results.values;
        clear();
        addAll(tempList);
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults result = new FilterResults();
        if (constraint == null || constraint.length() == 0) {
            result.values = originalItems;
            result.count = originalItems.size();
        } else {
            final ArrayList<NightOut> nlist = new ArrayList<NightOut>();
            String lowerConstraint = constraint.toString().toLowerCase();

            // loop through originalItems which always contains all items
            for(NightOut nightOut : originalItems) {
                final String value = nightOut.getAddress().toLowerCase();
                if (value.contains(lowerConstraint)) {
                    nlist.add(nightOut);
                }
            }

            result.values = nlist;
            result.count = nlist.size();
        }

        return result;
    }
}

【讨论】:

  • 谢谢老兄!如果我有一个女儿,我会让你娶我的女儿
猜你喜欢
  • 2018-08-09
  • 2012-09-28
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2012-10-29
相关资源
最近更新 更多