2012-03-29 5 views
0

У меня есть следующий код. Что я хочу достичь, это обновить отображаемый список, когда я нажимаю на запись, чтобы я мог пройти через список. Я нашел два способа без ранений, чтобы сделать это здесь, в stackoverflow, но не работает. Я также получил совет по созданию нового ListActivity для обновления данных, но это похоже на трату ресурсов?Как обновить Android ListActivity при изменении данных подключенного SimpleCursorAdapter

EDIT: Я нашел решение самостоятельно. Все, что вам нужно сделать, это вызвать «SimpleCursorAdapter.changeCursor (новый курсор)». Никаких уведомлений, никаких вещей в UI-Thread или что-то еще.

import android.app.ListActivity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class MyActivity extends ListActivity { 
    private DepartmentDbAdapter mDbHelper; 
    private Cursor cursor; 
    private String[] from = new String[] { DepartmentDbAdapter.KEY_NAME }; 
    private int[] to = new int[] { R.id.text1 }; 
    private SimpleCursorAdapter notes; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.departments_list); 
    mDbHelper = new DepartmentDbAdapter(this); 
    mDbHelper.open(); 

    // Get all of the departments from the database and create the item list 
    cursor = mDbHelper.fetchSubItemByParentId(1); 
    this.startManagingCursor(cursor); 

    // Now create an array adapter and set it to display using our row 
    notes = new SimpleCursorAdapter(this, R.layout.department_row, cursor, from, to); 
    this.setListAdapter(notes); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 

     // get new data and update the list 
     this.updateData(safeLongToInt(id)); 
    } 

    /** 
    * update data for the list 
    * 
    * @param int departmentId id of the parent department 
    */ 
    private void updateData(int departmentId) {  
     // close the old one, get a new one 
     cursor.close(); 
     cursor = mDbHelper.fetchSubItemByParentId(departmentId); 

    // change the cursor of the adapter to the new one 
    notes.changeCursor(cursor); 
    } 

    /** 
    * safely convert long to in to save memory 
    * 
    * @param long l the long variable 
    * 
    * @return integer 
    */ 
    public static int safeLongToInt(long l) { 
    if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) { 
     throw new IllegalArgumentException 
      (l + " cannot be cast to int without changing its value."); 
    } 
    return (int) l; 
    } 

} 

ответ

0

Во-первых, каждый раз, когда вы открываете новый курсор, закрываете предыдущий и управляете новым.

Во-вторых, вы меняете свой курсор, но как ваш адаптер курсора знает об этом? Это не так. Либо вы создаете адаптер, который может изменить его курсор, либо создать новый SimpleCursorAdapter вокруг вашего нового курсора и подключить его к списку.

Но вы были правы, вы не должны воссоздавать виджет списка.

+0

Я изменил функцию UpdateData на это без какого-либо использования, я искал мою задницу, чтобы найти, как это сделать, чтобы найти пример, учебник ... ничего. Разочарование, поскольку я пытаюсь заставить это работать в течение 2 дней. Не могу поверить, что никто не имел этой проблемы раньше! \t private void updateData (int departmentId) {\t \t \t this.stopManagingCursor (курсор); \t \t cursor.close(); \t \t cursor = mDbHelper.fetchSubItemByParentId (departmentId); \t \t this.startManagementCursor (курсор); \t \t Заметки SimpleCursorAdapter = новый SimpleCursorAdapter (это, R.layout.department_row, cursor, from, to); \t \t this.setListAdapter (примечания); \t} – DarsVaeda

+0

Обновите свой код. Я позабочусь об этом сегодня. – Snicolas

+0

Вы недалеко, он должен быть близок к работе сейчас – Snicolas

1

Вам необходимо уведомить об этом ListView, когда ваши данные будут изменены.

adapter.notifyDataSetChanged(); 

в вашем случае.

notes.notifyDataSetChanged(); 

Надеется, что это может помочь вам ...

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

  • Нет связанных вопросов^_^