как отображать контакты в списке в Android для Android api 11+

Мне жаль, если это похоже на тот же вопрос в миллион раз … но поиск в Google для этого не дает никаких результатов, просто куча устаревших руководств с использованием managedQuery и других устаревших решений …

Я прошел обучение разработчиков Android для получения списка контактов , но учебник неполный, и даже загрузка кода примера не помогает, потому что пример кода предназначен для более продвинутых манипуляций со списком контактов (поиск и т. Д.),

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

Я следовал за учебником, насколько мне известно, контакты не появляются. Я думаю, самое главное, что TO_IDS представляет собой целочисленный массив, который указывает на android.R.id.text1 . Я смущен тем, как это должно каким-то образом вытащить массив имен контактов.

Кроме того, я смущен, почему текстовое представление необходимо, когда конечной целью является отображение списка … В учебнике у нас есть mContactsList, который представляет собой представление списка … Но мы заполняем представление списка адаптером, указывающим на R.layout.contact_list_item который является только текстовым просмотром, заполненным TO_IDS, массивом целых чисел.

 mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contact_list_item, null, FROM_COLUMNS, TO_IDS, 0); mContactList.setAdapter(mCursorAdapter); 

Что я делаю неправильно и как просто отображать список контактов в списке?

EDIT: добавление в мой код:

в моем classе fragmentа:

 public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks{ private static final String[] FROM_COLUMNS = {ContactsContract.Contacts.DISPLAY_NAME_PRIMARY }; private static final int[] TO_IDS = {android.R.id.text1}; ListView mContactList; private SimpleCursorAdapter mCursorAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ return inflater.inflate(R.layout.contact_list_view,container,false); } @Override public void onActivityCreated(Bundle savedInstanceState){ super.onActivityCreated(savedInstanceState); mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contact_list_item, null, FROM_COLUMNS, TO_IDS, 0); mContactList.setAdapter(mCursorAdapter); } @Override public Loader onCreateLoader(int i, Bundle bundle) { return null; } @Override public void onLoadFinished(Loader cursorLoader, Cursor cursor) { } @Override public void onLoaderReset(Loader cursorLoader) { } } 

в моей activity_main.xml:

    

в my contact_list_view xml:

   

В моем contact_list_item xml

   

наконец, для contact_list_layout xml:

Что я могу добавить в contact_list_layout.xml ? Это просто пустой ? В учебнике не ясно, как обрабатывается этот xml. Он говорит, что этот XML является fragmentом, но если это fragment, почему мы определили listview уже в contact_list_view.xml ?

Небольшой урезанный пример для отображения имени контактов в ListView . Ниже Fragment распространяется ListFragment который имеет макет по умолчанию. Вам не нужно указывать свои собственные. Макет элементов списка также взят из макетов по умолчанию Android ( android.R.layout.simple_list_item_1 ), который представляет собой простую единую строку текста для каждого элемента.

 import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract.Contacts; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.SimpleCursorAdapter; public class ContactListFragment extends ListFragment implements LoaderCallbacks { private CursorAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // create adapter once Context context = getActivity(); int layout = android.R.layout.simple_list_item_1; Cursor c = null; // there is no cursor yet int flags = 0; // no auto-requery! Loader requeries. mAdapter = new SimpleCursorAdapter(context, layout, c, FROM, TO, flags); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // each time we are started use our listadapter setListAdapter(mAdapter); // and tell loader manager to start loading getLoaderManager().initLoader(0, null, this); } // columns requested from the database private static final String[] PROJECTION = { Contacts._ID, // _ID is always required Contacts.DISPLAY_NAME_PRIMARY // that's what we want to display }; // and name should be displayed in the text1 textview in item layout private static final String[] FROM = { Contacts.DISPLAY_NAME_PRIMARY }; private static final int[] TO = { android.R.id.text1 }; @Override public Loader onCreateLoader(int id, Bundle args) { // load from the "Contacts table" Uri contentUri = Contacts.CONTENT_URI; // no sub-selection, no sort order, simply every row // projection says we want just the _id and the name column return new CursorLoader(getActivity(), contentUri, PROJECTION, null, null, null); } @Override public void onLoadFinished(Loader loader, Cursor data) { // Once cursor is loaded, give it to adapter mAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader loader) { // on reset take any old cursor away mAdapter.swapCursor(null); } } 
  • Любой ярлык для инициализации всех элементов массива до нуля?
  • Как конвертировать минуты в часы и минуты (чч: мм) в java
  • В чем причина UnsupportedClassVersionError?
  • Java-язык с поддержкой Android
  • Синглтоны против контекста приложения в Android?
  • Почему XML используется для создания макетов пользовательского интерфейса в Android?
  • Получение параметров хеширования из запроса URL
  • Привязка данных Android с использованием тега include
  • Как переместить / переименовать файл из внутреннего хранилища приложений во внешнее хранилище на Android?
  • String.replaceAll без RegEx
  • Может (a == 1 && a == 2 && a == 3) оценивать true в Java?
  • Давайте будем гением компьютера.