2012-05-07 2 views
0

У меня возникли проблемы с обновлением моего списка ontextchanged. Когда я вхожу в одно письмо, отлично работает, но на втором письме приложение падает. В чем проблема? Я тестировал, и длина или длина правильная, но почему на втором вставленном символе в редакторе приложение падает? Может ли адаптер быть проблемой? Вот код!Обновление listview android на 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; 

     } 
    } 
} 

И выход из 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

изменить это int dolzina = filterText.length(); to int dolzina = filterText.getText(). toString.length(); –

+0

@ZazGmy сделал это, но не работает, ошибка такая же – Darko

+0

вместо использования dolzina = filterText.length(); вы используете «s», который используется как параметр в прослушивателе onTextChange –

ответ

1

Ваши элементы не одного и того же размера. Вы предполагаете, что каждый элемент в sonovi (getLatinicno) имеет по крайней мере дользина персонажей. Но readTxt не контролирует этот вид.

+0

как я могу это сделать – Darko

+0

Тера много. Например, вы можете попробовать try {} catch StringIndexOutOfBoundsException {// ничего не делать, потому что sonovi (i) должен быть кратным, чтобы быть равно filterText.getText()} – Tamara

Смежные вопросы