2014-10-02 2 views
-4

Прежде всего, моя база данных SQLite работает нормально, поскольку добавление, удаление и т. Д.Индекс массива из исключения исключений?

Я могу загрузить ArrayList в методе Oncreate просто отлично. Тем не менее,

Когда я попытался следующие:

добавить новый элемент в ArrayList,

Arraylist.clear(); 
LoadArrayList(); //reload the list 
Adapter.notifyDataSetChanged(); 

он бросил в силу близко с "ArrayIndexOutOfBoundsException: длина = 6; индекс = 6"

Когда я попытался это:

Arraylist.clear(); 
Adapter.notifyDataSetChanged(); 

элемент управления ListView не обнаружился ничего (ТНА t, чего я ожидал), поэтому он выполняет свою работу.

Вывод:

Почему это дает мне силы близко, когда я пытался обновить список с этой:

Arraylist.clear(); 
LoadArrayList(); 
Adapter.notifyDataSetChanged(); 

???????

Кроме того, я проверил базу данных для нового элемента, чтобы узнать, сохранена ли она. Новый элемент был добавлен и сохранен правильно. Я не понимаю, почему мой метод LoadArrayList не может прочитать новый элемент ...

Может кто-нибудь помочь?

Есть ли другой способ обновить список с новыми изменениями?

Большое спасибо.

Edit: добавлен код

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_layout); 

……. 

….. 

    try {   
     Open_SQLITE_DATABASE();   
     LoadArrayList(); //Load the list at start and IT WORKS …..         }  
    catch (Exception e) { } 

….. 

….. 

    listView = (ListView)findViewById(R.id.ListView); 
    listView.setAdapter(Arraylist); 

    listView. setOnItemClickListener(new OnItemClickListener() { 
    @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      ..... 


    } 

    }); 

…. 

…. 


@Override 
public boolean onOptionsItemSelected (MenuItem item) 
{ 

    switch (item.getItemId()) 
    { 
    case R.id.loadbutton: 
     Arraylist.clear(); 
     LoadArrayList(); //NOT WORKING ?????? 
     Adapter.notifyDataSetChanged(); 

    return true; 
    } 

... 

... 

Public void LoadArrayList(){ 

    Cursor cursor = SQLITE_DATABASE.getWritableData().query(SQLite_Database.getDatabaseTable(), null, null, null, null, null, null, null); 
    if(cursor != null) 
    { 
     while(cursor.moveToNext()) 
     { 
      String POSITION = cursor.getString(cursor.getColumnIndex(SQLite_Database.Position)); 
      Arraylist.add(POSITION);    
     } 
    } 

} 
+0

можете ли вы разместить свой код в loadarraylist? –

+0

'LoadArrayList()' должен быть в нижнем регистре - проверьте правила кодирования. В стороне, похоже, вы пытаетесь получить доступ к элементу массива, которого нет. Если длина равна 6, у вас есть индексы 0..5. Дважды щелкните запись log-cat, и она приведет вас к линии, где она не работает. Скорее всего, из этого станет очевидным. – 323go

+0

Код добавлен. Спасибо – IamAGoodPerson

ответ

0

Максимальный индекс вы должны попытаться получить доступ 5. Нумерация индекс начинается с 0.

length=6; index=6 означает, что вы пытаетесь получить доступ к индексу 6, который не существует , Проверьте логику LoadArrayList().

+0

Я это понимаю. У меня было 6 предметов в списке. Я добавил 7-й, очистил и перезагрузил список. Это дало мне эту ошибку. Я не понимаю, что он загружает список только в методе Oncreate. Почему он не может увидеть мой новый элемент, который добавлен в базу данных правильно? Спасибо – IamAGoodPerson

+0

после этого код 'LoadArrayList()'.Можете только гадать, не видя кода. – faizal

+0

Код добавлен. Спасибо – IamAGoodPerson

0

я, наконец, понял, решение:

@Override 
public boolean onOptionsItemSelected (MenuItem item) 
{ 

    switch (item.getItemId()) 
    { 
    case R.id.loadbutton: 
     Arraylist.clear(); 
     LoadArrayList(); 
     Adapter.notifyDataSetChanged(); 

     listView.setAdapter(Arraylist); //This is needed to prevent the force close 

    return true; 
    } 

В основном, listView.setAdapter (Список_массивов) отсутствовало. Надеюсь, это поможет кому-то другому.

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