gpt4 book ai didi

java - 未调用自定义 ArrayAdapter getFilter()

转载 作者:行者123 更新时间:2023-11-30 01:45:55 24 4
gpt4 key购买 nike

在过去使用 ArrayList 和 ArrayAdapter 填充 AutoCompleteTextView 的简单 Android 应用程序中,我现在用自定义适配器替换了 ArrayAdapter。原因是我需要在搜索列表之前从输入的文本中去除空格和一些其他字符(即,输入“O.M.”应该规范化为“OM”,然后应该显示以“OM”开头的建议。

我尝试在 GitHub 上的以下提交中执行此操作:https://github.com/Natureshadow/MirWTFApp/commit/260a4deaee449cb63d3af3c446c94466b90f736c

自定义适配器有一个 getFilter 方法,该方法应该返回一个执行规范化的自定义过滤器,但永远不会调用 getFilter()。

如何找出未调用它的原因,以及如何让应用程序使用自定义过滤器?

StackOverflow 有一些描述类似问题的问题,但所有这些问题都包括更改自定义适配器中 ArrayList 数据的处理,而我没有这样做。

最佳答案

最终的解决方案是一个自定义的 ArrayAdapter 子类,它在 ArrayFilter 甚至看到它之前添加了一个过滤器。

对主应用程序的改变很小,它只需要实例化新命名的 WtfArrayAdapter 并向其构造函数传递一个额外的参数:对包含规范化方法的对象的对象引用(在当前 äpp 的设计,即 MainActivity 类, future 的重构会做得更好):

-        ArrayAdapter acronymKeys = new ArrayAdapter(this,
- android.R.layout.simple_list_item_1, sorted);
+ ArrayAdapter acronymKeys = new WtfArrayAdapter(this,
+ android.R.layout.simple_list_item_1, sorted, this);

自定义 WtfArrayAdapter 必须能够从 ArrayFilter (这是 ArrayAdapter 的内部私有(private)类)调用方法,所以它需要属于 package android.widget;。我会饶你full imports, comments, etc.并将重现以下重要部分:

public class WtfArrayAdapter<T> extends ArrayAdapter<T> {

新成员:- 预过滤器归一化方法的对象- 我们内部私有(private)类的对象- 父类的内部私有(private)类对象(不幸的是,ArrayAdapter.mFilterprivate)

    private MainActivity sParent;
private WtfArrayFilter sFilter;
private Filter pFilter;

扩展构造函数(我们只需要实现我们实际调用的那个):- 调用继承的构造函数- 存储父级的 mFilter 值- 实例化我们自己的 WtfArrayFilter- 存储预过滤器规范化方法的对象,因为 WtfArrayFilter 稍后需要它

    public WtfArrayAdapter(Context context, @LayoutRes int resource,
@NonNull T[] objects, MainActivity parent) {
super(context, resource, 0, Arrays.asList(objects));
sParent = parent;
sFilter = new WtfArrayFilter();
pFilter = super.getFilter();
}

覆盖 ArrayAdaptergetFilter() 方法以始终返回我们新的 WtfArrayFilter:

    public Filter getFilter() {
return sFilter;
}

WtfArrayFilter 实现为 Filter 子类,就像 ArrayFilter 一样,并将所有无聊(即未更改)的调用转发给继承的 数组过滤器:

    private class WtfArrayFilter extends Filter {
protected void publishResults(CharSequence constraint,
FilterResults results) {
pFilter.publishResults(constraint, results);
}

在调用继承的ArrayFilter的过滤方法之前,我们只需要改变一个方法来做我们自己的过滤:

        protected FilterResults performFiltering(CharSequence prefix) {
return pFilter.performFiltering(prefix == null ? null :
sParent.normaliseAcronym(prefix.toString()));
}
}
}

欢迎改进,我仍然是 Java™ 初学者。

关于java - 未调用自定义 ArrayAdapter getFilter(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com