【发布时间】:2011-10-30 20:05:51
【问题描述】:
我有一个列表,它将过滤 EditText 字段中的输入,并根据他们键入的内容填充 ListView。
例如,如果用户键入“al”,它将填充名字或姓氏以“al”开头的名称。
我的问题是,当用户将 EditText 字段退格到没有输入字母的位置时,我的程序会崩溃。我不确定为什么我最初的 if 语句没有被使用。
这不是 ListView 为空导致崩溃的问题,因为如果我键入不在列表中的名称,ListView 将保持为空并且不会崩溃。
private void AlterAdapter() {
partialNames.clear();
if (searchName.getText().toString() == "")
partialNames.add("There are no names that meet your criteria");
else {
String seekString = searchName.getText().toString();
String firstLetter = seekString.substring(0,1).toString().toUpperCase();
Log.d("JAY", "The firstLetter is: " + firstLetter);
if (!seekString.isEmpty() && seekString.length() == 1) {
//firstLetter = seekString.toUpperCase();
for (int i = 0; i < searchNames.size(); i++) {
if (searchNames.get(i).toString().contains(firstLetter)) {
partialNames.add(searchNames.get(i).toString());
}
}
}
else if (!seekString.isEmpty() && seekString.length() > 1) {
//searchCriteria = searchCriteria.concat(seekString);
String searchWord = firstLetter.concat(seekString.substring(1,seekString.length()));
Log.d("JAY", "The seekString is " + seekString);
Log.d("JAY", "The searchWord is " + searchWord);
for (int i = 0; i < searchNames.size(); i++) {
if (searchNames.get(i).toString().contains(searchWord)) {
partialNames.add(searchNames.get(i).toString());
}
}
}
}
adapter.notifyDataSetChanged();
}
这里是日志:
D/AndroidRuntime(1518): 关闭虚拟机
W/dalvikvm(1518): threadid=1: 线程以未捕获的异常退出 (组=0x40015560)
E/AndroidRuntime(1518):致命异常:主要
E/AndroidRuntime(1518): java.lang.StringIndexOutOfBoundsException
E/AndroidRuntime(1518):在 java.lang.String.substring(String.java:1651)
E/AndroidRuntime(1518):在 com.jaylefler.contacts.SearchContacts.AlterAdapter(SearchContacts.java:92)
E/AndroidRuntime(1518):在 com.jaylefler.contacts.SearchContacts.access$0(SearchContacts.java:88)
E/AndroidRuntime(1518):在 com.jaylefler.contacts.SearchContacts$1.onTextChanged(SearchContacts.java:73)
E/AndroidRuntime(1518):在 android.widget.TextView.sendOnTextChanged(TextView.java:6295)
E/AndroidRuntime(1518):在 android.widget.TextView.handleTextChanged(TextView.java:6336)
E/AndroidRuntime(1518):在 android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6485)
E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889)
E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:400)
E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269)
E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432)
E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:218)
E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:28)
E/AndroidRuntime(1518):在 android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:60)
E/AndroidRuntime(1518):在 android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:123)
E/AndroidRuntime(1518):在 android.text.method.QwertyKeyListener.onKeyDown(QwertyKeyListener.java:327)
E/AndroidRuntime(1518):在 android.text.method.TextKeyListener.onKeyDown(TextKeyListener.java:132)
E/AndroidRuntime(1518):在 android.widget.TextView.doKeyDown(TextView.java:4433)
E/AndroidRuntime(1518):在 android.widget.TextView.onKeyDown(TextView.java:4267)
E/AndroidRuntime(1518):在 android.view.KeyEvent.dispatch(KeyEvent.java:1256)
E/AndroidRuntime(1518):在 android.view.View.dispatchKeyEvent(View.java:3855)
E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)
E/AndroidRuntime(1518):在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
E/AndroidRuntime(1518):在 com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
E/AndroidRuntime(1518):在 android.app.Activity.dispatchKeyEvent(Activity.java:2073)
E/AndroidRuntime(1518):在 com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
E/AndroidRuntime(1518):在 android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
E/AndroidRuntime(1518):在 android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
E/AndroidRuntime(1518):在 android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
E/AndroidRuntime(1518):在 android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(1518): 在 android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(1518):在 android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime(1518):在 java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(1518):在 java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(1518):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime(1518):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime(1518): 在 dalvik.system.NativeStart.main(Native 方法)
W/ActivityManager(74):强制完成活动 com.jaylefler.contacts/.SearchContacts
W/ActivityManager(74):活动暂停超时 HistoryRecord{4086e540 com.jaylefler.contacts/.SearchContacts}
I/Process (1518):发送信号。 PID:1518 SIG:9
I/ActivityManager(74):处理 com.jaylefler.contacts (pid 1518) 已经死了。
E/InputDispatcher(74):通道'409a83e8 com.jaylefler.contacts/com.jaylefler.contacts.ContactProjectActivity (server)' ~ 消费者关闭输入通道或发生错误。 事件=0x8
E/InputDispatcher(74):通道'409a83e8 com.jaylefler.contacts/com.jaylefler.contacts.ContactProjectActivity (server)' ~ 频道已无法恢复,将被销毁!
I/WindowManager(74): 赢得死亡: Window{4086ff40 com.jaylefler.contacts/com.jaylefler.contacts.SearchContacts 暂停=假}
I/WindowManager(74): 赢得死亡: Window{409a83e8 com.jaylefler.contacts/com.jaylefler.contacts.ContactProjectActivity 暂停=假}
E/InputDispatcher(74): 收到虚假接收回调 未知输入通道。 fd=150,事件=0x8
W/InputManagerService(74): 发送 RemoteException setActive(false) 通知 pid 1518 uid 10030
【问题讨论】:
-
如何添加 logcat 输出?
-
好的,这是我发生错误时的 logcat 输出:
-
顺便说一句,当使用 String 操作时,您已经不再需要使用 toString() 了。
-
Bingo:我敢打赌,它是 substring(0,1)。您是否尝试过 slkorolev 的建议?
-
我在代码前面加上 if (searchName.getText().toString().length() != 0) 并且能够让事情正常工作:-)
标签: android