Я пытаюсь использовать 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
?
Класса, который проходит CursorAdapter ожидает объект Cursor во время создания экземпляра. Где я должен создать экземпляр класса CustomCursorAdapter?Должен ли я сделать это в функции onLoadFinished()? – akshayt23
создать экземпляр 'onCreateView', как вы делаете это сейчас, передавая« null »для курсора. Сохраните ссылку в члене класса. Когда вызывается onLoadFinished, вызывайте 'mAdapter.swapCursor (курсор)' – Blackbelt