ArrayAdapter建议基于字符串出现在单词而不是开头

时间:2016-11-30 01:52:26

标签: android android-arrayadapter

我想在我的应用程序的一个活动中用arrayadapter中的另一种语言表达一个单词及其翻译。我无法通过翻译和单词本身单独列出它。理想的情况是让适配器中的每个列表都以这样的形式显示出来。

  

word1(trans1)

     

word2(trans2)

     

等。 (等)

并且无论用户使用数组适配器向搜索栏输入什么内容,数组适配器都会通过翻译或标题向他们建议正确的单词。基本上,如果输入存在于字符串中,则应该建议它。

我不知道如何编写自定义方法来整理arrayadapter中的值以及如何确定列出的内容,但是我需要它来查找字符串中任何位置的输入,而不仅仅是在一开始就像现在一样。

感谢任何帮助。

编辑:仍然没有任何想法。看了一下文档,找不到任何有用的方法。

1 个答案:

答案 0 :(得分:0)

这是获取所选语言环境的res-string的方法:

Locale locale = new Locale("fr");
Configuration config = new Configuration();
config.locale = locale;
getResources().updateConfiguration(config, null);
getResources().getString(R.string.your_string);

事先你应该在更改之前保护一个本地权利实例,这样你就可以将它重置为原始状态。

如果您在班级中使用String,那么您应该将其更改为int,以便您可以参考资源标识符。

对于您的项目列表,您可以存储某些版本的字符串(按语言环境),以便以后过滤。

现在过滤。

您必须通过

向您的适配器添加过滤器
adapter.setFilter(filterString)

将SearchView添加到您的布局并编写类似这样的内容

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            AndroidUtils.hideKeyboard(getActivity());
            return true;
        }

        @Override
        public boolean onQueryTextChange(final String newText) {
            adapter.getFilter().filter(newText);
            adapter.notifyDataSetChanged();
            return true;
        }

    });

适配器应包含2个数据列表:过滤和源。将上下文推送到适配器的构造函数以从资源中检索字符串。

您的适配器应该实现Filterable。然后覆盖方法getFilter()。它将是这样的:

@Override
public Filter getFilter() {
    return new Filter(){
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            constraint = constraint.length()>0? constraint.toString().toLowerCase():"";
            FilterResults result = new FilterResults();
            if (constraint.toString().length() > 0) {
                ArrayList<Integer> filterList = new ArrayList<>();
                for(Integer current: sourceListInAdapter){
                   if(getString(textForFilter).toLowerCase().contains(constraint)){
                        filterList.add(current);
                    }
                }
                result.values = filterList;
                result.count = filterList.size();
            }else {
                result.values = sourceListInAdapter;
                result.count = sourceListInAdapter.size();
            }
            return result;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            temporaryData = (ArrayList<Integer>) results.values;
            //TEMPORARY data is data which is used in appearance.
            notifyDataSetChanged();
        }
    };

}

在函数Filter#performFiltering中产生自己的搜索逻辑。我展示了过滤它的方法。在这种情况下,结果将被当前(设备)区域设置过滤掉,并带有当前区域设置结果。

还有一件事。关于区域设置检测。这对您有所帮助:

public String localeToString(Locale l) {
    return l.getLanguage() + "," + l.getCountry();
}

public Locale stringToLocale(String s) {
    StringTokenizer tempStringTokenizer = new StringTokenizer(s,",");
    if(tempStringTokenizer.hasMoreTokens())
    String l = tempStringTokenizer.nextElement();
    if(tempStringTokenizer.hasMoreTokens())
    String c = tempStringTokenizer.nextElement();
    return new Locale(l,c);
}

希望,这有帮助