2012-06-01 2 views
1

Я использую два SimpleCursorAdapters для отображения текста и изображений в строке в моем Listview. Проблема в том, что при одновременном вызове этих адаптеров они конфликтуют друг с другом. В конце мой Listview показывает только данные SimpleCursorAdapter, которые я назвал последними.Как слить два SimpleCursorAdapters в Android?

Что мне нужно сделать, это объединить эти два SimpleCursorAdapters, хотя они используют разные базы данных sql.

Любые идеи для решения этой проблемы?

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.reminder_list); 
    mDbHelper = new RemindersDbAdapter(this); 
    mImageHelper = new ImageAdapter(this); 
    mDbHelper.open(); 
    mImageHelper.open(); 
    fillData(); 
    fillImages(); 
    registerForContextMenu(getListView()); 
} 

// 
// Fills the ListView with the data from the SQLite Database. 
// 
private void fillData() { 
    Cursor remindersCursor = mDbHelper.fetchAllReminders(); 
    startManagingCursor(remindersCursor); 

    // Creates an array with the task title. 
    String[] from = new String[] {RemindersDbAdapter.KEY_TITLE, RemindersDbAdapter.KEY_BODY}; 

    // Creates an array for the text. 
    int[] to = new int[] {R.id.text1, R.id.text2}; 

    // SimpleCursorAdapter which is displayed. 
    SimpleCursorAdapter reminders = new SimpleCursorAdapter(this, R.layout.reminder_row, remindersCursor, from, to); 
    setListAdapter(reminders); 

} 

// 
// Fills the ListView with the images from the SQLite Database. 
// 
private void fillImages() { 
    Cursor imageCursor = mImageHelper.fetchAllImages(); 
    startManagingCursor(imageCursor); 

    // Creates an array with the image path. 
    String[] fromImage = new String[] {ImageAdapter.KEY_IMAGE}; 

    // Creates an array for the text. 
    int[] toImage = new int[] {R.id.icon}; 

    // SimpleCursorAdapter which is displayed. 
    SimpleCursorAdapter images = new SimpleCursorAdapter(this, R.layout.reminder_row, imageCursor, fromImage, toImage); 
    setListAdapter(images); 
} 

ответ

2

Вы можете использовать MergeCursor класс разоблачить ряд индивидуальных курсоров в виде одного курсора. Поскольку ваши адаптеры связывают разные столбцы-> виджеты, вам может потребоваться написать собственный подкласс SimpleCursorAdapter (или просто CursorAdapter), чтобы вы могли сделать правильный тип привязки в зависимости от строки.

+0

Можете ли вы привести мне пример того, как реализовать такой MergeCursor? Я никогда не использовал его раньше. – user1420042

0

Как насчет создания собственного адаптера (расширение BaseAdapter), который будет указывать на правильные данные каждый раз, когда это необходимо? таким образом вы можете иметь полный контроль над тем, когда и где показывать каждый элемент.

вы можете использовать 2 адаптера и использовать их для нового адаптера.

0

Что мне нужно сделать, это объединить эти два SimpleCursorAdapters, хотя они используют разные базы данных sql.

Если два адаптера являются действительно разные (например, различные схемы строк), используйте my MergeAdapter, чтобы объединить два существующих адаптеров в один, а затем использовать MergeAdapter с ListView.

Тем не менее, в вашем случае окажется, что у вас просто есть два Cursors с различным содержанием, и в этом случае ответ superfell на использование MergeCursor, вероятно, лучший подход.

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