我想在我的应用程序的一个活动中用arrayadapter中的另一种语言表达一个单词及其翻译。我无法通过翻译和单词本身单独列出它。理想的情况是让适配器中的每个列表都以这样的形式显示出来。
word1(trans1)
word2(trans2)
等。 (等)
并且无论用户使用数组适配器向搜索栏输入什么内容,数组适配器都会通过翻译或标题向他们建议正确的单词。基本上,如果输入存在于字符串中,则应该建议它。
我不知道如何编写自定义方法来整理arrayadapter中的值以及如何确定列出的内容,但是我需要它来查找字符串中任何位置的输入,而不仅仅是在一开始就像现在一样。
感谢任何帮助。
编辑:仍然没有任何想法。看了一下文档,找不到任何有用的方法。答案 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);
}
希望,这有帮助