J'ai des problèmes avec la mise à jour de ma listview ontextchanged. Quand j'entre une lettre fonctionne très bien, mais sur la deuxième lettre l'application se bloque. Quel peut être le problème? J'ai testé et la dolzina ou la longueur est correcte mais pourquoi sur le deuxième caractère inséré dans l'edittext l'application se bloque? L'adaptateur peut-il être un problème? Voici le code!Mise à jour de listview android sur textchanged StringIndexOutOfBoundsException
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;
}
}
}
Et la sortie de 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)
changez cet int dolzina = filterText.length(); à int dolzina = filterText.getText(). toString.length(); –
@ZazGmy a fait cela mais ne fonctionne pas, l'erreur est la même – Darko
au lieu d'utiliser dolzina = filterText.length(); vous utilisez "s" qui est utilisé comme paramètre dans le listener onTextChange –