2012-05-07 3 views
0

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) 
+0

changez cet int dolzina = filterText.length(); à int dolzina = filterText.getText(). toString.length(); –

+0

@ZazGmy a fait cela mais ne fonctionne pas, l'erreur est la même – Darko

+0

au lieu d'utiliser dolzina = filterText.length(); vous utilisez "s" qui est utilisé comme paramètre dans le listener onTextChange –

Répondre

1

Vos éléments ne sont pas de la même taille. Vous supposez que chaque élément de sonovi (getLatinicno) a au moins des caractères dolzina. Mais readTxt ne fait aucun contrôle de ce genre.

+0

comment puis-je faire cela – Darko

+0

Thera sont de plusieurs façons. Par exemple, vous pouvez essayer {} catch StringIndexOutOfBoundsException {// ne rien faire, car sonovi (i) est trop court pour être égal à filterText.getText()} – Tamara

Questions connexes