I'm having trouble with updating my listview ontextchanged. When I enter one letter works fine, but on the second letter the app crashes. What can be the problem? I've tested and the dolzina or length is correct but why on the second inserted character in the edittext the app crashes? Can the adapter be a problem? Here is the code!
public class Main extends ListActivity {
private ArrayList<Son> sonovi;
private EditText filterText = null;
private SonovnikAdapter adapter;
private ListView list;
Translator t = new Translator();
private Intent intent;
private ArrayList<Son> temp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initStuff();
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
intent.putExtra("opis", sonovi.get(position).getOpis());
intent.putExtra("naslov", sonovi.get(position).getNaslov());
startActivity(intent);
}
});
filterText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
int dolzina = filterText.length();
temp = new ArrayList<Son>();
temp.clear();
for (int i = 0; i < sonovi.size(); i++) {
if (filterText.getText().toString().toLowerCase()
.equals((String) sonovi.get(i).getLatinicno()
.toLowerCase().subSequence(0, dolzina))) { //line 63
temp.add(sonovi.get(i));
}
}
SonovnikAdapter testc = new SonovnikAdapter(Main.this,
R.layout.item, temp);
list.setAdapter(testc);
testc.notifyDataSetChanged();
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
intent.putExtra("opis", temp.get(position).getOpis());
intent.putExtra("naslov", temp.get(position)
.getNaslov());
startActivity(intent);
}
});
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
private ArrayList<Son> readTxt() {
ArrayList<Son> s = new ArrayList<Son>();
InputStream is = this.getResources().openRawResource(R.raw.sonovnik);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = null;
String naslov, opis, latinica;
String[] tmp;
try {
while ((str = br.readLine()) != null) {
tmp = str.split("-");
naslov = tmp[0];
opis = tmp[1];
if (tmp.length >= 3) {
latinica = tmp[2];
s.add(new Son(naslov, opis, latinica));
}
}
is.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
private void initStuff() {
list = getListView();
list.setTextFilterEnabled(true);
sonovi = new ArrayList<Son>();
sonovi = readTxt();
intent = new Intent(this, Details.class);
adapter = new SonovnikAdapter(this, R.layout.item, sonovi);
setListAdapter(adapter);
filterText = (EditText) findViewById(R.id.search_box);
}
private class SonovnikAdapter extends ArrayAdapter<Son> {
private ArrayList<Son> items;
public SonovnikAdapter(Context context, int textViewResourceId,
ArrayList<Son> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_item, null);
}
Son o = items.get(position);
if (o != null) {
TextView naslov = (TextView) v.findViewById(R.id.textView1);
if (naslov != null) {
naslov.setText(o.getNaslov().toString());
}
}
return v;
}
}
}
And the output from logcat:
05-07 15:16:58.770: E/AndroidRuntime(31689): FATAL EXCEPTION: main
05-07 15:16:58.770: E/AndroidRuntime(31689): java.lang.StringIndexOutOfBoundsException
05-07 15:16:58.770: E/AndroidRuntime(31689): at java.lang.String.substring(String.java:1651)
05-07 15:16:58.770: E/AndroidRuntime(31689): at java.lang.String.subSequence(String.java:2040)
05-07 15:16:58.770: E/AndroidRuntime(31689): at com.sonovnik.petkovski.Main$2.onTextChanged(Main.java:63)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.widget.TextView.sendOnTextChanged(TextView.java:6321)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.widget.TextView.handleTextChanged(TextView.java:6362)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6511)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:502)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:409)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:28)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:654)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:415)
05-07 15:16:58.770: E/AndroidRuntime(31689): at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:318)
05-07 15:16:58.770: E/AndroidRuntime(31689): at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:75)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.os.Looper.loop(Looper.java:130)
05-07 15:16:58.770: E/AndroidRuntime(31689): at android.app.ActivityThread.main(ActivityThread.java:3835)
05-07 15:16:58.770: E/AndroidRuntime(31689): at java.lang.reflect.Method.invokeNative(Native Method)
05-07 15:16:58.770: E/AndroidRuntime(31689): at java.lang.reflect.Method.invoke(Method.java:507)
05-07 15:16:58.770: E/AndroidRuntime(31689): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
05-07 15:16:58.770: E/AndroidRuntime(31689): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
05-07 15:16:58.770: E/AndroidRuntime(31689): at dalvik.system.NativeStart.main(Native Method)