android - 在 AutoCompleteTextView 中进行选择时崩溃
问题描述
显然,这和我遇到的问题相同,尽管我的 Textview 是 AutoCompleteTextView。我正在从我的联系人列表中选择。每当我进行选择时,都会出现以下错误:
java.lang.IllegalArgumentException: Invalid offset: -1. Valid range is [0, 23] at android.text.method.WordIterator.checkOffsetIsValid(WordIterator.java:384) at android.text.method.WordIterator.preceding(WordIterator.java:72) at android.widget.SpellChecker$SpellParser.parse(SpellChecker.java:599) at android.widget.SpellChecker$SpellParser.parse(SpellChecker.java:517) at android.widget.SpellChecker.spellCheck(SpellChecker.java:242) at android.widget.Editor.updateSpellCheckSpans(Editor.java:707) at android.widget.Editor.sendOnTextChanged(Editor.java:1256) at android.widget.TextView.sendOnTextChanged(TextView.java:9368) at android.widget.TextView.setText(TextView.java:5397) at android.widget.TextView.setText(TextView.java:5250) at android.widget.EditText.setText(EditText.java:113) at com.webnation.text2email.widgets.AutoCompleteContactTextView$2.onItemClick(AutoCompleteContactTextView.java:183)
这似乎来自在允许范围之外选择的光标。上面链接中给出的解决方法似乎没有帮助。这是发生崩溃的地方:
public class AutoCompleteContactTextView extends AppCompatAutoCompleteTextView implements CustomAdapter.AsyncLoad {
private void init(Context context, AttributeSet attrs, boolean programmatic) {
this.context = context;
this.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (AutoCompleteContactTextView.this.getAdapter() != null && !s.toString().equalsIgnoreCase("")) {
((CustomAdapter) AutoCompleteContactTextView.this.getAdapter()).getFilter().filter(s);
((CustomAdapter) AutoCompleteContactTextView.this.getAdapter()).notifyDataSetChanged();
ArrayList<People> arrPeople = ((CustomAdapter) AutoCompleteContactTextView.this.getAdapter()).dataList;
Log.d("We're Here", "We're here in onTextChanged");
//searchText = s;
}
if (!somethingIsSelected) {
selected = null;
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
this.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selected = (People) getAdapter().getItem(position);
GlobalVars.selectedPerson = selected;
somethingIsSelected = true;
String name = selected.getName().toString();
setText(null);
setText(selected.getName(), TextView.BufferType.SPANNABLE); //<--crash happens here.
Log.d("Something Selected", String.valueOf(somethingIsSelected));
}
});
}
我在模拟器 Nexus 5 API 27 上运行它。这也发生在运行 API 27 的 Pixel XL 模拟器上。这不会在真实设备上崩溃(我的三星 Galaxy S7 Edge,运行 API 24)。
解决方案
显然,所选项目的值被设置为类,而不是字符串。我更新了 AutoCompleteTextView 的过滤器,然后应用程序可以获得字符串的值。
this.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selected = (People) getAdapter().getItem(position);
GlobalVars.selectedPerson = selected;
somethingIsSelected = true;
Log.d("Something Selected", String.valueOf(somethingIsSelected));
}
});
@Override
public Filter getFilter() {
filter = new Filter() {
@Override
public String convertResultToString(Object resultValue) {
String str = ((People)(resultValue)).getName();
return str;
}
.....
}
AutoCompleteTextView 的 get Item 返回一个 Object,因此该问题的另一个修复方法也可能发生变化:
@Override
public Object getItem(int position) {
return toDisplayList.get(position);
}
至
@Override
public String getItem(int position) {
return toDisplayList.get(position).getName();
}
我正在使用此类的一个版本:
推荐阅读
- python - TypeError:字段“id”需要一个数字,但得到了 OrderedDict
- php - 如何在 PHP 中将多个数组平均为一个?
- css - 如何在按钮的中心水平制作渐变
- r - 为什么我的条件式选择输入()失败了?
- html - 视频无法在所有浏览器上播放 (FFMPEG)
- mysql - 如何将带有来自 MySQL('Concat')的数组的 JSON 对象嵌入到 NodeJS 中的 EJS 文件中?
- excel - 使用 Power Query,应用筛选器以仅显示最高值
- excel - Excel 中的 vba 显示“找不到项目或库”但带有本地变量
- javascript - 继续计算迭代数组
- entity-framework - 如何在 LINQ 中使用聚合函数?