2

Я пытаюсь использовать CursorLoader для извлечения данных из моего ContentProvider из потока пользовательского интерфейса. Затем я использую его для заполнения списка. Раньше я использовал SimpleCursorAdapter, и все работает отлично. Но теперь я хочу иметь разные представления для строк списка в зависимости от данных.Использование пользовательского адаптера с CursorLoader

Так что я написал пользовательского адаптера расширения базовый адаптер.

public class CustomAdapter extends BaseAdapter { 

    private Context mContext; 
    private LayoutInflater mInflater; 

    public CustomAdapter(Context context) { 
     mContext = context; 
     mInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return 10; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     Log.d("CustomAdapter", "Check" + i + 1); 
     if (view == null) { 
      view = mInflater.inflate(R.layout.listview_text_layout, viewGroup, false); 
      //if(text) load text view 
      //else load image view 
     } 

     return view; 
    } 
} 

Но чтобы получить что-нибудь, чтобы показать, метод getCount() должен возвращать значение больше 0.

Как я могу получить количество предметов, загруженных CursorLoader, чтобы все элементы отображались? В настоящее время я просто возвращаю 10, чтобы он работал, но это, очевидно, не самый правильный способ сделать это.

Вот мой Fragment класс, который реализует CursorLoader:

public class MessageFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 

    private AbsListView mListView; 
    private CustomAdapter mAdapter; 
    ... 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_message, container, false); 

     getLoaderManager().initLoader(MESSAGES_LOADER, null, this); 

     // Set the adapter 
     mListView = (AbsListView) view.findViewById(android.R.id.list); 
     mListView.setAdapter(mAdapter); 

     return view; 
    } 


    @Override 
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
     String[] projection = {MessageEntry._ID, MessageEntry.MESSAGE_DATA, MessageEntry.MESSAGE_TIMESTAMP}; 

     switch (i) { 
      case MESSAGES_LOADER: 
       return new CursorLoader(
         getActivity(), 
         Uri.parse("content://com.rubberduck.dummy.provider/messages"), 
         projection, 
         null, 
         null, 
         null 
       ); 
      default: 
       return null; 
     } 
    } 
} 

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

ответ

0

Вместо продления BaseAdapter, вы можете продлить CursorAdapter.

Когда onLoadFinished называется, вам нужно только позвонить swapCursor. Вам не нужно переопределять getCount(). super уже заботится о возврате правильного значения.

+0

Класса, который проходит CursorAdapter ожидает объект Cursor во время создания экземпляра. Где я должен создать экземпляр класса CustomCursorAdapter?Должен ли я сделать это в функции onLoadFinished()? – akshayt23

+0

создать экземпляр 'onCreateView', как вы делаете это сейчас, передавая« null »для курсора. Сохраните ссылку в члене класса. Когда вызывается onLoadFinished, вызывайте 'mAdapter.swapCursor (курсор)' – Blackbelt

0

SimpleCursorAdapter с ViewBinder набора или CursorAdapter достаточно, чтобы удовлетворить ваши требования, от того, что я вижу, что вам не нужно, чтобы продлить BaseAdapter.

Как только вы инициализируете загрузчик через LoaderManager, вы получите результаты с помощью метода onLoadFinished().

Чтобы обновить метод вызова данных swapCursor() на адаптере

Обратите внимание также, что Activity начинается все зарегистрированные погрузчики в onStart() так альтернативному место, чтобы запустить ваш погрузчик будет в onActivityCreated().

В этом руководстве описывается способом, который @Blackbelt и я описываю:

http://code.tutsplus.com/tutorials/android-fundamentals-properly-loading-data--mobile-5673

После того, как вы погрузитесь глубже в погрузчик я предлагаю читать статью:

http://chalup.github.io/blog/2014/06/12/android-loaders/

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