2015-12-18 2 views
0

У меня есть ListFragment и поведение, которое я хочу, - это ввести фрагмент и увидеть его заполненным данными из базы данных, которая у меня есть. Жесткая часть заключается в том, что мне также хотелось бы, чтобы этот фрагмент узнал, когда новая база добавлена ​​в базу данных и покажет ее.Заполнение спискаFragment с данными базы данных

В настоящее время единственным решением, которое у меня есть, является выполнение обновления с определенным интервалом внутри фрагмента, но я хотел бы знать, есть ли более эффективное решение и как это можно сделать.

+0

использовать contentprovider + API-интерфейс Loaders ... если вы будете вставлять строки через CP, то перезагрузка будет выполнена автоматически ... btw, вопрос слишком широк ... вы должны быть точнее ... fx откуда «новая строка» отправляется (фоновый поток? сервис? B-Receiver) – Selvin

ответ

1

Для этого вы можете использовать CursorLoader. Предполагается также, что у вас есть ContentProvider в качестве источника данных для приложения, о котором я не буду говорить здесь, но вы можете узнать о них в this post, если хотите.

Чтобы синхронизировать данные базы данных в ListView, вы должны сделать две вещи:

  • Создание пользовательского адаптера, который реализует CursorAdapter
  • Реализовать LoaderManager в вашем фрагменте

Для реализовать LoaderManager просто переопределить три необходимых метода. Один из них используется для настройки вашего курсора, который будет подавать результаты на ваш адаптер. С этого момента, если ваш ContentProvider должным образом уведомляет об изменениях в URI, вы заметите эти изменения в адаптере. Вот фрагмент кода загрузчика:

public class AccountsFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>{ 
    private static final int MY_LOADER = 0; 

    @Override 
    public void onActivityCreated() { 
     super.onActivityCreated(); 
     getLoaderManager.initLoader(MY_LOADER, null, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     switch(id){ 
      case MY_LOADER: 
       return new CursorLoader(
         getActivity(), 
         MY_URI, 
         MY_COLUMNS, 
         null, 
         null, 
         null 
       ); 
      default: 
       throw new UnsupportedOperationException("Unknown loader id: " + id); 
     } 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     switch(loader.getId()){ 
      case MY_LOADER: 
       mAdapter.swapCursor(datA); 
      default: 
       throw new UnsupportedOperationException("Unknown loader id: " + loader.getId()); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     switch(loader.getId()){ 
      case MY_LOADER: 
       mAdapter.swapCursor(null); 
       break; 
      default: 
       throw new UnsupportedOperationException("Unknown loader id: " + loader.getId()); 
     } 
    } 

} 

Я много узнал об этом из Udacity course, которая учит вас много о Android снизу вверх, и если вы ищете полный обзор, я думаю, это очень много стоит вашего времени.

+0

спасибо большое помощник –

+0

@GastonDelaCruzBayugar не проблема! У меня есть довольно большой опыт работы с CursorLoaders, поэтому дайте мне знать, если у вас возникнут проблемы. – AdamMc331

+0

спасибо большое @McAdam плохо позвольте вам kmow –

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