2011-03-24 55 views
0

我在我的應用程序中有一個自動完成功能。我動態地設置適配器,但是當我點擊其中一個建議的單詞時,我得到一個IndexOutOfBoundsException。我不知道如何解決它。一些幫助將不勝感激。索引越界自動完成android

下面的代碼:

final ArrayList<Person> suggestions = new ArrayList<Person>(); 
     final ArrayList<Person> allPersons = database.selectPersons(); 

     autocomplete = (AutoCompleteTextView)findViewById(R.id.autocomplete); 
     autocomplete.setThreshold(1); 
     autocomplete.addTextChangedListener(new TextWatcher() { 

      public void afterTextChanged(Editable s) { 
      } 

      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      } 

      public void onTextChanged(CharSequence s, int start, int before,int count) { 

       input = autocomplete.getText().toString(); 

       if(input.length() == 0){ 
        suggestions.clear(); 
        input.toUpperCase(); 
        for (Person p : allPersons) { 
         if(p.getName().startsWith(input)){ 
          suggestions.add(p); 

         } 
        } 
        autocomplete.setAdapter(new ArrayAdapter<Person>(getApplicationContext() , R.layout.listitem , suggestions)); 
       } 
       if(input.length() > 0){ 
        suggestions.clear(); 
        input = Character.toUpperCase(input.charAt(0)) + input.substring(1);; 
        for (Person p : allPersons) { 
         if(p.getName().startsWith(input)){ 
          suggestions.add(p); 

         } 
        } 
        autocomplete.setAdapter(new ArrayAdapter<Person>(getApplicationContext() , R.layout.listitem , suggestions)); 
       } 

      } 
     }); 

     autocomplete.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
       Person input = (Person)arg0.getItemAtPosition(arg2); 
       Log.d("The person name is",input.getName()); 
      } 
     }); 

在此先感謝。

+0

你什麼行IndexOutOfBounds? – Blundell 2011-03-24 11:01:25

+0

我得到它:'Person input =(Person)arg0.getItemAtPosition(arg2); ' – madcoderz 2011-03-24 11:26:22

回答

2

您的代碼表示,

如果輸入字符串長度爲0 ...大寫,然後檢查這個詞與它啓動,但輸入的字符串長度爲0,所以你爲什麼會想這樣做這兩事情呢?

你應該在你的方法頂部的第一件事是:

input = autocomplete.getText().toString(); 

if(input == null || input.isEmpty()) { 
     return; // user hasn't done anything or has cleared the box 
} 

編輯

你應該改變你的方法輸入變量名,以幫助您:

onItemClick(AdapterView<?> parent, View view, int position, long id); 

你的數組索引超出範圍在這裏,你需要檢查你的鑄件和你正在做的列表。確保它包含您的物品。

+0

'if(input.length()== 0)'表示:如果用戶輸入一個字符大寫。這並不意味着:如果'input.isEmpty()'但是是的,如果我實現解決方案,我可以刪除很多代碼。無論如何,這不是問題。問題是我得到的索引越界:'Person input =(Person)arg0.getItemAtPosition(arg2); '你有什麼想法如何解決它?謝謝 – madcoderz 2011-03-24 11:26:00

+0

if(input.length()== 1)意思是:如果用戶輸入一個字符大寫。 – Blundell 2011-03-24 11:30:47

+0

我得到這個異常'java.lang.IndexOutOfBoundsException:無效的索引1,大小爲1'我得到的價值清單是從建議。我不知道爲什麼它幾乎是空的 – madcoderz 2011-03-24 11:43:34

0

所以我找到了答案。問題是我想在用戶輸入一個單詞時提供建議。每次你輸入一個字母,你都會進入onTextChanged()方法,並且帶有建議的列表被刪除並填充新的建議。訣竅是當用戶從建議中選擇一個單詞進入onTextChanged()方法時,建議列表就會填滿您選擇的單詞。所以我所做的是將Person input = (Person)arg0.getItemAtPosition(arg2);更改爲Person input = (Person)suggestions.get(0);這將是用戶選擇的單詞。我在代碼中進行了一些清理工作,並受到@Blundell的啓發。我希望這可以幫助別人。謝謝您的幫助。

這裏是最後的代碼:

final ArrayList<Person> suggestions = new ArrayList<Person>(); 
final ArrayList<Person> allPersons = database.selectPersons(); 

autocomplete = (AutoCompleteTextView)findViewById(R.id.autocomplete); 
autocomplete.setThreshold(1); 
autocomplete.addTextChangedListener(new TextWatcher() { 

public void afterTextChanged(Editable s) { 
} 

public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
} 

public void onTextChanged(CharSequence s, int start, int before,int count) { 

    input = autocomplete.getText().toString(); 

    if(input.length() > 0){ 
     suggestions.clear(); 
     input = Character.toUpperCase(input.charAt(0)) + input.substring(1);; 
     for (Person p : allPersons) { 
      if(p.getName().startsWith(input)){ 
       suggestions.add(p); 
      } 
     } 
     autocomplete.setAdapter(new ArrayAdapter<Person>(getApplicationContext() , R.layout.listitem , suggestions)); 
     } 

    } 
}); 

autocomplete.setOnItemClickListener(new OnItemClickListener() { 

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
        Person input = suggestions.get(0); 
        Log.d("The person name is",input.getName()); 
       } 
      }); 
+1

您應該將我的答案標記爲正確的請:-)因爲我給了你答案,你只是重新寫了它。 – Blundell 2011-03-24 13:09:18

+0

你去了。感謝您的幫助 – madcoderz 2011-03-24 14:09:15

+0

感謝您的提示。祝你今天愉快。 – madcoderz 2011-03-25 08:28:19